第一张表"release_name";
| | |名称代码
|:---|:--:|
——| | | 1>
| 2 | |…
第二表"release_value"| | |名称代码
|:---|:--:|
——| | | 1>
| 2 | |…
第3个表是用来连接上面2个表的"release_code_name":
| release_name_code | release_value_code |
|:----------------|:----------------:|
| 1 ----------------| 2 -----------------|
| 1 ----------------| 2 -----------------|
| 2 ----------------| 3 -----------------|
我使用SQLAlchemy与FastApi。我需要做的是将两个表连接到一个由第三个映射表。
我所尝试的并没有打印出我需要的内容:
Link = Table(
"release_code_name",
Base.metadata,
Column("release_name_code", Integer, ForeignKey("release_name_code.code"), primary_key=True),
Column("release_value_code", Integer, ForeignKey("release_value_code.code"), primary_key=True),
PrimaryKeyConstraint("release_name_code", "release_value_code")
)
class ReleaseNames(Base):
__tablename__="release_name"
code = Column(Integer, primary_key=True)
name = Column(String, unique=True, nullable=False)
build_name = relationship("BuildNames", secondary="release_code_name", back_populates="release_name")
class BuildNames(Base):
__tablename__ = "release_value"
code = Column(Integer, primary_key=True)
name = Column(String, unique=True, nullable=False)
release_name = relationship(ReleaseNames, secondary="release_code_name", back_populates="build_name")
@router.get("/")
async def build_names_by_release(release_name: str, db: Session = Depends(get_database_session)):
result = db.query(ReleaseNames).join(BuildNames, ReleaseNames.build_name)
return result
我想我有一个问题在控制器功能连接表。
在您的relationship
中,secondary
不接受字符串,而是包含您的Table的变量:
build_name = relationship("BuildNames", secondary=Link, back_populates="release_name")
release_name = relationship("ReleaseNames", secondary=Link, back_populates="build_name")
在创建表时,在ForeignKey
中,您传递了错误的参数。事实上,你给它release_name_code.code
而不是release_name.code
。你想链接你的列到表release_name
,而不是你的列release_name_code
(你现在正在创建)。
release_name_code
是要创建的列的名称。release_name
是你的表ReleaseNames
。
所以按如下方式替换表的ForeignKey:
Column("release_name_code", Integer, ForeignKey("release_name.code"), primary_key=True),
Column("release_value_code", Integer, ForeignKey("release_value.code"), primary_key=True),