SqlAlchemy: как создавать связи между пользователями, то есть заводить друзей - PullRequest
6 голосов
/ 20 апреля 2011

Я пытаюсь использовать SqlAlchemy для создания таблиц базы данных Sqlite внутри Pylons.Я использую декларативную базу для одновременного создания таблицы, класса и преобразователя с помощью следующего кода:

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 с другими Facebook.Другими словами, чтобы построить связи между ними и установить их как «друзей».Как бы я структурировал базу данных, чтобы сделать это возможным?

Редактировать: я изменил код, который я обновил выше, и я добавил объект ассоциации под названием «Друзья», но когда я добавляю другадля объекта facebook, он работает только в одном направлении.Если я добавлю Боба в друзья к Джону, я смогу увидеть Боба в John.Friends, но не смогу увидеть John в Bob.Friends.Что я делаю неправильно?Я попытался добавить следующие отношения в классе Друзья:

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

, но получаю ошибку:

sqlalchemy.exc.ArgumentError: Не удалось определить условие соединения между родителем / дочерним элементомтаблицы на отношения Friends.friend.Укажите выражение «primaryjoin».Если присутствует «вторичный», также необходимо «вторичное соединение».

1 Ответ

2 голосов
/ 20 апреля 2011

Где это сильно отличается от отношений 1: N или N: M?Хранить отношения друзей в таблице isFriend (user1_id, user2_id) просто.Если вы думаете о дружеских отношениях как о графике, отметьте это: http://www.sqlalchemy.org/docs/orm/examples.html#directed-graphs

...