首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SQLAlchemy -指向同一表相同属性的多个外键

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

Stack Overflow用户
提问于 2017-06-08 11:25:37
回答 1查看 12.5K关注 0票数 15

我的数据库结构..。

代码语言:javascript
运行
复制
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])

在sqlite上使用烧瓶-SQLAlchemy运行时,我得到以下错误

sqlalchemy.exc.AmbiguousForeignKeysError:无法确定关系Person.user上父/子表之间的连接条件--存在多个连接表的外键路径。指定'foreign_keys‘参数,提供那些列的列表,这些列应该被计算为包含对父表的外键引用。

这是我的pip freeze

代码语言:javascript
运行
复制
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

编辑:一个BankSlip可以有一个用户和一个引用.这应该是一对一的关系,其中parent -> childBankSlip -> UserBankSlip -> Reference。所以,一个孩子可以有多个父母!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-08 11:38:45

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

代码语言:javascript
运行
复制
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")

使用声明式可以将外键定义为字符串。,这将有助于解决循环依赖关系。或者,您可以使用backref代替back_populates:

代码语言:javascript
运行
复制
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位于关系的错误一端,或者它是多余的,因为一个人可以被多个BankSlips引用。它属于人的身边,所以:

代码语言:javascript
运行
复制
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])
票数 27
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44434410

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档