SqlAlchemy: как создавать связи между пользователями, то есть заводить "друзей"
Я пытаюсь использовать 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, но не смогу увидеть его в Bob.Friends. Что я делаю неправильно? Я попытался добавить следующие отношения в классе Друзья:
friend = relationship("Facebook", backref="friends")
но я получаю ошибку:
sqlalchemy.exc.ArgumentError: Не удалось определить условие соединения между родительскими / дочерними таблицами в отношениях Friends.friend. Укажите выражение "primaryjoin". Если "вторичный" присутствует, "вторичное соединение" также необходимо.
1 ответ
Где это сильно отличается от отношений 1:N или N:M? Хранить отношения друзей в таблице isFriend(user1_id, user2_id) просто. Если вы думаете о дружеских отношениях как о графике, проверьте это: http://www.sqlalchemy.org/docs/orm/examples.html