SqlAlchemy + fastApi 试图连接多对多表

SqlAlchemy + fastApi trying to join many - to - many tables

第一个 table “release_name”:

|代码|名称|

|:---|:--:|

|1---|一些|

|2---|任何|

...

第二个table“release_value”: |代码|名称|

|:---|:--:|

|1---|一些|

|2---|任何|

...

3rd 是一个 table 在 "release_code_name":

之上进行 2 tables 连接

|release_name_code|release_value_code|

|:----------------|:----------------:|

|1----------------|2----------------|

|1----------------|2----------------|

|2----------------|3----------------|

我正在将 SQLAlchemy 与 FastApi 结合使用。我需要做的是将 2 tables 加入 1 by 3 map table.

我尝试过的并没有打印出我需要的东西:

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

我想我在控制器功能中加入 table 时遇到了问题。

在您的 relationship 中,secondary 不采用字符串,而是包含您的 Table:

的变量
build_name = relationship("BuildNames", secondary=Link, back_populates="release_name")
release_name = relationship("ReleaseNames", secondary=Link, back_populates="build_name")

在 table 的创建过程中,在 ForeignKey 中,您传递了一个错误的参数。事实上,你给了它 release_name_code.code 而不是 release_name.code 。 您想要 link 您的专栏到 Table release_name 而不是您的专栏 release_name_code (您现在正在创建)。

release_name_code 是您正在创建的列的名称。 release_name 是你的 Table ReleaseNames.

所以替换你的Table的外键如下:

Column("release_name_code", Integer, ForeignKey("release_name.code"), primary_key=True),
Column("release_value_code", Integer, ForeignKey("release_value.code"), primary_key=True),