SqlAlchemy: 如何在用户之间创建连接,即建立“好友”关系

6 投票
1 回答
2139 浏览
提问于 2025-04-16 16:05

我正在尝试使用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

撰写回答