SqlAlchemy:如何在用户之间建立联系,即建立"朋友"

joh*_*ohn 6 python pylons database-design 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)
Run Code Online (Sandbox Code Playgroud)

我只是学习所有不同的关系,比如多对一,一对多,一对一,多对多以及如何用表和/或声明地实现每个关系.我想知道,我如何将一个物体与自身联系起来?例如,我想将facebook与其他facebook关联起来.换句话说,在它们之间建立联系,并将它们建立为"朋友".我如何构建数据库以实现这一目标?

编辑:我更改了上面更新的代码,并添加了一个名为"Friends"的关联对象,但是当我将一个朋友添加到facebook对象时,它只能在一个方向上工作.如果我把鲍勃作为约翰的朋友加入,我可以在John.Friends中看到鲍勃,但我在Bob.Friends中看不到约翰.我究竟做错了什么?我尝试在Friends类中添加以下关系:

friend = relationship("Facebook", backref="friends")
Run Code Online (Sandbox Code Playgroud)

但是我收到一个错误:

sqlalchemy.exc.ArgumentError:无法确定关系Friends.friend上的父/子表之间的连接条件.指定'primaryjoin'表达式.如果存在'secondary',则还需要'secondaryjoin'.

小智 2

这与 1:N 或 N:M 关系有何不同?将好友关系存储在表 isFriend(user1_id, user2_id) 中非常简单。如果您将友谊关系视为图表,请检查以下内容: http: //www.sqlalchemy.org/docs/orm/examples.html#directed-graphs