如何在SQLAlchemy(python,flask)中为模型用户创建多对多关系
问题内容:
我需要创建一个名为 friends 的表,该表应如下所示:
朋友:
- 用户身份
- friend_id
我试图通过SQLALchemy的教程来做到这一点,但是我还没有找到如何使同一张表成为多对多关系。
这是我尝试过的:
# friends table
# many to many - user - user
_friends = db.Table('friends',
db.Column('user_id', db.Integer, db.ForeignKey('users.id')),
db.Column('friend_id', db.Integer, db.ForeignKey('users.id'))
)
class User(db.Model, UserMixin):
# table name in database
__tablename__ = 'users'
# primary key for table in db
id = db.Column(db.Integer, primary_key=True)
# email is unique!
email = db.Column(db.String(255), unique=True)
# password, max = 255
password = db.Column(db.String(255))
# category relation
categories = relationship("Category")
# cards relation
cards = relationship("BusinessCard")
# friends
friends = db.relationship(
'User',
backref="users",
secondary=_friends
)
它说:
AmbiguousForeignKeysError:无法确定关系User.friends的父/子表之间的联接条件-
有多个外键路径通过辅助表’friends’链接表。指定“
foreign_keys”参数,提供这些列的列表,这些列应被视为包含从辅助表到父表和子表中每个表的外键引用。
有谁知道如何正确地做到这一点?
问题答案:
您尝试实现的模式是多对多关系的特例。SQLAlchemy将此称为邻接列表关系,我建议尝试按照那里的代码进行操作:
http://docs.sqlalchemy.org/en/rel_0_9/orm/relationships.html#adjacency-list-
relationships
关键是那里的’remote_side’kwarg。
原因是:您得到的错误是因为关联表(“ friends”)有两个指向表“ users”的外键:一个在“ user_id”列上,一个在“
friend_id”列上。SQLAlchemy尝试基于外键自动检测关系,但是失败了,因为它无法确定关系的发展方向。因此,如果您在“朋友”表中有这样的条目
user_id : 1
friend_id : 2
SQLAlchemy不能判断user_1是否将user_2作为朋友,反之亦然。
如果这看起来令人困惑,那就是。社交网络意义上的友谊可以是单 射的
,在这种情况下,user_1拥有朋友user_2并不意味着user_2将user_1拥有为朋友;或者可以是 双射的
,在这种情况下两者是等效的。我在这里显示年龄,但前者由Livejournal代表,而后者由Facebook代表。
我不知道如何在SQLAlchemy中实现单数关系。这是一个丑陋的UNION ALL或类似MySQL的东西。