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),
第一个 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),