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

时间:2011-04-20 04:42:52

标签: python database-design sqlalchemy pylons

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

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

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

friend = relationship("Facebook", backref="friends")

但是我收到了错误:

  

sqlalchemy.exc.ArgumentError:可以   不确定之间的连接条件   关系上的父/子表   Friends.friend。指定一个   'primaryjoin'表达式。如果   '次要'存在,   “secondaryjoin”也是必需的。

1 个答案:

答案 0 :(得分:2)

这与1:N或N:M关系有何不同?在表中存储朋友关系isFriend(user1_id,user2_id)是直截了当的。如果您将友谊关系视为图表,请查看:http://www.sqlalchemy.org/docs/orm/examples.html#directed-graphs