SQLAlchemy多个外键指向同一表的相同属性

2024-10-01 15:40:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我的数据库结构。。。。在

class Person(db.Model):
    id = db.Column(db.Integer, primary_key=True)

    user = db.relationship("BankSlip", back_populates="person_user")
    reference = db.relationship("BankSlip", back_populates="person_reference")

class BankSlip(db.Model):
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)

    person_user_id = db.Column(db.Integer, db.ForeignKey(Person.id))
    person_ref_id = db.Column(db.Integer, db.ForeignKey(Person.id))

    person_user = db.relationship("Person", back_populates="user", uselist=False, foreign_keys=[person_user_id])
    person_reference = db.relationship("Person", back_populates="reference", uselist=False, foreign_keys=[person_ref_id])

在使用Flask SQLAlchemy在sqlite上运行时出现以下错误

sqlalchemy.exc.AmbiguousForeignKeysError: Could not determine join condition between parent/child tables on relationship Person.user - 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.

这是我的pip freeze

^{pr2}$

编辑:一张银行卡可有一个用户和一个参考。。。。它应该是一对一的关系,其中parent -> childBankSlip -> User或{}。所以,一个孩子可以有多个父母!在


Tags: keyidtruedbbackcolumnintegerperson
1条回答
网友
1楼 · 发布于 2024-10-01 15:40:57

按照错误消息的指示,提供所需的外键参数:

class Person(db.Model):
    id = db.Column(db.Integer, primary_key=True)

    user = db.relationship("BankSlip", foreign_keys='BankSlip.person_user_id', back_populates="person_user")
    reference = db.relationship("BankSlip", foreign_keys='BankSlip.person_ref_id', back_populates="person_reference")

使用声明性的you can define the foreign keys as a string,这将有助于解决循环依赖关系。或者,您可以使用backref而不是back_填充:

^{pr2}$

请注意,uselist=False位于关系的错误端,或者它是多余的,因为一个人可以被多个银行单引用。它属于人的一方,因此:

from sqlalchemy.orm import backref

...
    person_user = db.relationship("Person", backref=backref("user", uselist=False), foreign_keys=[person_user_id])
    person_reference = db.relationship("Person", backref=backref("reference", uselist=False), foreign_keys=[person_ref_id])

相关问题 更多 >

    热门问题