SqlAlchemy: 如何在用户之间创建连接,即建立“好友”关系
我正在尝试使用SqlAlchemy在Pylons中创建Sqlite数据库表。我使用声明式基类来一次性创建表、类和映射器,代码如下:
class Friends(Base):
__tablename__ = 'friends'
left_id = Column(Integer, ForeignKey('facebooks.id'), primary_key=True)
right_id = Column(Integer, ForeignKey('facebooks.id'), primary_key=True)
def __repr__(self):
return "<Friend(id:'%s' id: '%s')>" % (self.left_id, self.right_id)
class Facebook(Base):
__tablename__ = 'facebooks'
id = Column(Integer, primary_key=True)
friends = relationship("Facebook",
secondary=Friends.__tablename__,
primaryjoin= id == Friends.right_id,
secondaryjoin= Friends.left_id == id)
def __init__(self, id):
self.id = id
def __repr__(self):
return "<User(id:'%s')>" % (self.id)
我刚开始学习各种不同的关系,比如多对一、一对多、一对一和多对多,以及如何用表或声明式来实现这些关系。我想知道,如何让一个对象和它自己关联起来?比如,我想把Facebook用户之间建立联系,也就是说,让他们成为“朋友”。我该如何设计数据库来实现这个功能呢?
编辑:我修改了代码,已经在上面更新了,并添加了一个叫“Friends”的关联对象,但当我给一个Facebook对象添加朋友时,它只在一个方向上有效。如果我把Bob添加为John的朋友,我可以在John.Friends中看到Bob,但在Bob.Friends中却看不到John。我哪里做错了?我尝试在Friends类中添加以下关系:
friend = relationship("Facebook", backref="friends")
但是我遇到了一个错误:
sqlalchemy.exc.ArgumentError: 无法确定 在关系 Friends.friend中父表/子表之间的连接条件。请指定一个 'primaryjoin' 表达式。如果 'secondary' 存在, 也需要 'secondaryjoin'。
1 个回答
2
这和1:N或N:M的关系有什么不同呢?把朋友关系存储在一个表里,比如isFriend(user1_id, user2_id),其实很简单。如果把友谊关系看作一个图形,可以参考这个链接:http://www.sqlalchemy.org/docs/orm/examples.html#directed-graphs