我可以在与SQLalchemy的同一表中指出两个外国钥匙吗?

发布于 2025-02-08 18:09:45 字数 1280 浏览 2 评论 0原文

因此,我有两个表:

# "parent" table, each user has multiple "reports_received" and "reports_made"
class User(Base):
    __tablename__ = "users"

    id: str = Column("id", String(16), primary_key=True)

    reports_received = relationship("Report", back_populates="reported_user")
    reports_made = relationship("Report", back_populates="reporting_user")

# "child" table, each report has one "reported_user" and "reporting_user"
class Report(Base):
    __tablename__ = "reports"

    report_id: int = Column("report_id", Integer(), primary_key=True)

    reported_user_id = Column("reported_user_id", ForeignKey("users.id"))
    reporting_user_id = Column("reporting_user_id", ForeignKey("users.id"))

    reported_user = relationship("User",back_populates="reports_received", foreign_keys=[reported_user_id])
    reporting_user = relationship("User", back_populates="reports_made", foreign_keys=[reporting_user_id])

报告应具有record_userreporting_user,都存在于“用户”表中。 但这就是我尝试创建一些用户并分配一些报告时得到的:

sqlalchemy.exc.biguulforeignkeyserror:无法确定关系用户上的父/子表之间的加入条件。Reports_received-有多个链接表的外键路径。指定“ forefer_keys”参数,提供了这些列的列表,这些列应算作包含对父表的外键引用。

我不明白为什么会给我这个错误,因为我已经指定了外国键。我是否缺少其他事情,或者做这样的事情没有多大意义?

So I have two tables:

# "parent" table, each user has multiple "reports_received" and "reports_made"
class User(Base):
    __tablename__ = "users"

    id: str = Column("id", String(16), primary_key=True)

    reports_received = relationship("Report", back_populates="reported_user")
    reports_made = relationship("Report", back_populates="reporting_user")

# "child" table, each report has one "reported_user" and "reporting_user"
class Report(Base):
    __tablename__ = "reports"

    report_id: int = Column("report_id", Integer(), primary_key=True)

    reported_user_id = Column("reported_user_id", ForeignKey("users.id"))
    reporting_user_id = Column("reporting_user_id", ForeignKey("users.id"))

    reported_user = relationship("User",back_populates="reports_received", foreign_keys=[reported_user_id])
    reporting_user = relationship("User", back_populates="reports_made", foreign_keys=[reporting_user_id])

Reports should have a reported_user and a reporting_user, both being present in the "users" table.
But this is what I get when I try to create some users and assign them some reports:

sqlalchemy.exc.AmbiguousForeignKeysError: Could not determine join condition between parent/child tables on relationship User.reports_received - there are multiple foreign key paths linking the tables. Specify the 'foreign_keys' argument, providing a list of those columns which should be counted as containing a foreign key reference to the parent table.

I can't understand why it's giving me this error, since I've already specified the foreign keys. Is there something else I'm missing or does doing something like this not make much sense?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

月亮邮递员 2025-02-15 18:09:45

Sqlalchemy只需要更多帮助就可以通过在用户类中指定forefer_keys =来调和关系。切换类声明的顺序并添加这些声明,就像

# "child" table, each report has one "reported_user" and "reporting_user"
class Report(Base):
    __tablename__ = "reports"

    report_id: int = Column("report_id", Integer(), primary_key=True)

    reported_user_id = Column("reported_user_id", ForeignKey("users.id"))
    reporting_user_id = Column("reporting_user_id", ForeignKey("users.id"))

    reported_user = relationship(
        "User",
        back_populates="reports_received",
        foreign_keys=[reported_user_id],
    )
    reporting_user = relationship(
        "User", back_populates="reports_made", foreign_keys=[reporting_user_id]
    )


# "parent" table, each user has multiple "reports_received" and "reports_made"
class User(Base):
    __tablename__ = "users"

    id: str = Column("id", String(16), primary_key=True)

    reports_received = relationship(
        "Report",
        back_populates="reported_user",
        foreign_keys=[Report.reported_user_id],
    )
    reports_made = relationship(
        "Report",
        back_populates="reporting_user",
        foreign_keys=[Report.reporting_user_id],
    )

让我们这样做一样

engine.echo = True
with Session(engine) as sess:
    gord = User(id="Gord")
    alexander = User(id="Alexander")
    sess.add(Report(reported_user=gord, reporting_user=alexander))
    sess.commit()

"""SQL emitted
INSERT INTO users (id) VALUES (?)
[generated in 0.00036s] [('Gord',), ('Alexander',)]
INSERT INTO reports (reported_user_id, reporting_user_id) VALUES (?, ?)
[generated in 0.00031s] ('Gord', 'Alexander')
"""

SQLAlchemy just needs a little more help to reconcile the relationships by specifying the foreign_keys= in the User class as well. Switching the order of the class declarations and adding those, as in

# "child" table, each report has one "reported_user" and "reporting_user"
class Report(Base):
    __tablename__ = "reports"

    report_id: int = Column("report_id", Integer(), primary_key=True)

    reported_user_id = Column("reported_user_id", ForeignKey("users.id"))
    reporting_user_id = Column("reporting_user_id", ForeignKey("users.id"))

    reported_user = relationship(
        "User",
        back_populates="reports_received",
        foreign_keys=[reported_user_id],
    )
    reporting_user = relationship(
        "User", back_populates="reports_made", foreign_keys=[reporting_user_id]
    )


# "parent" table, each user has multiple "reports_received" and "reports_made"
class User(Base):
    __tablename__ = "users"

    id: str = Column("id", String(16), primary_key=True)

    reports_received = relationship(
        "Report",
        back_populates="reported_user",
        foreign_keys=[Report.reported_user_id],
    )
    reports_made = relationship(
        "Report",
        back_populates="reporting_user",
        foreign_keys=[Report.reporting_user_id],
    )

lets us do this

engine.echo = True
with Session(engine) as sess:
    gord = User(id="Gord")
    alexander = User(id="Alexander")
    sess.add(Report(reported_user=gord, reporting_user=alexander))
    sess.commit()

"""SQL emitted
INSERT INTO users (id) VALUES (?)
[generated in 0.00036s] [('Gord',), ('Alexander',)]
INSERT INTO reports (reported_user_id, reporting_user_id) VALUES (?, ?)
[generated in 0.00031s] ('Gord', 'Alexander')
"""
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文