【问题标题】:Multiple foreign keys in one to many relationship - SqlAlchemy一对多关系中的多个外键 - SqlAlchemy
【发布时间】:2020-12-30 08:49:41
【问题描述】:

我是 SQL Alchemy 的新手,我需要帮助来实现以下关系:

我有两个表 TrendsClosestTrends,我想声明两个一对多关系:

Tables relationship

在 SQL 中,应该是:

ALTER TABLE "closest_trends" ADD FOREIGN KEY ("id_trend_ref") REFERENCES "trends" ("id") ON DELETE CASCADE;

ALTER TABLE "closest_trends" ADD FOREIGN KEY ("id_trend_close") REFERENCES "trends" ("id") ON DELETE CASCADE;

我尝试了以下实现:

class Trends(Base):
    __tablename__ = "trends"
    __table_args__ = (
        UniqueConstraint(
            "name", "id_region", "language_iso", name="name_id_region_language"
        ),
    )
    id = Column(Integer, primary_key=True, index=True, unique=True)
    .
    .
    .
    closest_trends = relationship("ClosestTrends", backref="Trends")
   
    def __str__(self):
        return "Trends"



class ClosestTrends(Base):
    __tablename__ = "closest_trends"
    __table_args__ = (
        UniqueConstraint(
            "id_trend_ref", "id_trend_close", name="id_trend_ref_id_trend_close"
        ),
    )
    id = Column(Integer, primary_key=True, index=True, unique=True)
    .
    .
    .
    
    id_trend_ref = Column(
        Integer, ForeignKey("trends.id", ondelete="CASCADE"), nullable=False
    )
    id_trend_close = Column(
        Integer, ForeignKey("trends.id", ondelete="CASCADE"), nullable=False
    )
    
    def __str__(self):
        return "ClosestTrends"

我不工作,我收到以下错误:

sqlalchemy.exc.AmbiguousForeignKeysError: 无法确定加入 关系上的父/子表之间的条件 Trends.closest_trends - 有多个外键路径链接 桌子。指定“foreign_keys”参数,提供一个列表 那些应该算作包含外键的列 引用父表。

有人知道如何解决这个问题吗?

非常感谢

【问题讨论】:

  • 我不明白。两个外键是相同的,它们甚至不能为空。在成为 SQLA 问题之前,这不是设计问题吗?
  • 在我看来,最好有一个相关趋势的多对多关联表,并且您只需存储一次趋势的外键
  • 感谢您的快速回答。我们的数据库中有 40 多个表,并且有一些约束迫使我们遵循这种设计并具有这两个关系。它在 SQL 中运行良好,但使用 SqlAlchemy 实现起来有点困难。
  • 呃 :P 好吧,relationshipforeign_keys 参数作为一个列表,我想,所以试试 closest_trends = relationship("ClosestTrends", backref="Trends", foreign_keys=['closest_trends.id'])
  • 我也尝试在relationship 中使用foreign_keys。关于您提出的方案,我得到: sqlalchemy.exc.ArgumentError: 参数“foreign_keys”的基于列的表达式对象; got: 'closest_trends.id', type ,我也试过 ClosestTrends.id 但它没有用

标签: python sql database postgresql sqlalchemy


【解决方案1】:

您的解决方案写在官方网站上。
https://docs.sqlalchemy.org/en/13/orm/join_conditions.html#handling-multiple-join-paths
根据官方网站,我是这样实现的。

class Trends(Base):
    __tablename__ = "trends"
    __table_args__ = (
        UniqueConstraint(
            "name", "id_region", "language_iso", name="name_id_region_language"
        ),
    )
    id = Column(Integer, primary_key=True, index=True, unique=True)
    .
    .
    .
    # closest_trends = relationship("ClosestTrends", backref="Trends")
   
    def __str__(self):
        return "Trends"

class ClosestTrends(Base):
    __tablename__ = "closest_trends"
    __table_args__ = (
        UniqueConstraint(
            "id_trend_ref", "id_trend_close", name="id_trend_ref_id_trend_close"
        ),
    )
    id = Column(Integer, primary_key=True, index=True, unique=True)
    .
    .
    .
    
    id_trend_ref = Column(
        Integer, ForeignKey("trends.id", ondelete="CASCADE"), nullable=False
    )
    id_trend_close = Column(
        Integer, ForeignKey("trends.id", ondelete="CASCADE"), nullable=False
    )
    
    trend_ref = relationship("Trends", foreign_keys=[id_trend_ref])
    trend_close = relationship("Trends", foreign_keys=[id_trend_close])

    def __str__(self):

【讨论】:

    猜你喜欢
    • 2016-09-06
    • 2023-03-04
    • 2021-07-10
    • 1970-01-01
    • 1970-01-01
    • 2018-05-30
    • 2019-12-06
    • 2011-04-25
    • 1970-01-01
    相关资源
    最近更新 更多