SQLAlchemy - 指向相同 table 相同属性的多个外键
SQLAlchemy - Multiple Foreign key pointing to same table same attribute
我的数据库结构....
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
appdirs==1.4.3
APScheduler==3.3.1
bcrypt==3.1.3
blinker==1.4
cffi==1.9.1
click==6.7
cssselect==1.0.1
cssutils==1.0.2
Flask==0.12
Flask-Login==0.4.0
Flask-Mail==0.9.1
Flask-Principal==0.4.0
Flask-SQLAlchemy==2.2
Flask-WTF==0.14.2
gunicorn==19.7.1
itsdangerous==0.24
Jinja2==2.9.5
lxml==3.7.3
MarkupSafe==1.0
nose==1.3.7
packaging==16.8
pkg-resources==0.0.0
premailer==3.0.1
pycparser==2.17
pyparsing==2.2.0
python-dateutil==2.6.0
pytz==2017.2
requests==2.13.0
schedule==0.4.2
six==1.10.0
SQLAlchemy==1.1.6
tzlocal==1.4
uWSGI==2.0.15
Werkzeug==0.12.1
WTForms==2.1
编辑:一张银行单可以有一个用户和一个参考....它应该是一个one-to-one关系,其中parent -> child
是BankSlip -> User
或 BankSlip -> Reference
。所以,一个child可以有多个parents!
按照错误消息的指示提供所需的 foreign_keys 参数:
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")
With Declarative you can define the foreign keys as a string,这将有助于解决循环依赖。或者你可以使用 backref 而不是 back_populates:
class Person(db.Model):
id = db.Column(db.Integer, primary_key=True)
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", backref="user", uselist=False, foreign_keys=[person_user_id])
person_reference = db.relationship("Person", backref="reference", uselist=False, foreign_keys=[person_ref_id])
请注意,您在关系的错误一端得到了 uselist=False
,或者它是多余的,因为一个人可以被多个银行单引用。它属于 Persons 这边,所以:
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])
我的数据库结构....
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
appdirs==1.4.3
APScheduler==3.3.1
bcrypt==3.1.3
blinker==1.4
cffi==1.9.1
click==6.7
cssselect==1.0.1
cssutils==1.0.2
Flask==0.12
Flask-Login==0.4.0
Flask-Mail==0.9.1
Flask-Principal==0.4.0
Flask-SQLAlchemy==2.2
Flask-WTF==0.14.2
gunicorn==19.7.1
itsdangerous==0.24
Jinja2==2.9.5
lxml==3.7.3
MarkupSafe==1.0
nose==1.3.7
packaging==16.8
pkg-resources==0.0.0
premailer==3.0.1
pycparser==2.17
pyparsing==2.2.0
python-dateutil==2.6.0
pytz==2017.2
requests==2.13.0
schedule==0.4.2
six==1.10.0
SQLAlchemy==1.1.6
tzlocal==1.4
uWSGI==2.0.15
Werkzeug==0.12.1
WTForms==2.1
编辑:一张银行单可以有一个用户和一个参考....它应该是一个one-to-one关系,其中parent -> child
是BankSlip -> User
或 BankSlip -> Reference
。所以,一个child可以有多个parents!
按照错误消息的指示提供所需的 foreign_keys 参数:
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")
With Declarative you can define the foreign keys as a string,这将有助于解决循环依赖。或者你可以使用 backref 而不是 back_populates:
class Person(db.Model):
id = db.Column(db.Integer, primary_key=True)
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", backref="user", uselist=False, foreign_keys=[person_user_id])
person_reference = db.relationship("Person", backref="reference", uselist=False, foreign_keys=[person_ref_id])
请注意,您在关系的错误一端得到了 uselist=False
,或者它是多余的,因为一个人可以被多个银行单引用。它属于 Persons 这边,所以:
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])