Самореферентные отношения «многие ко многим» в sqlalchemy

Я пытаюсь создать самореферентную связь «многие ко многим» (это означает, что Line может иметь много родительских строк и много дочерних строк) в sqlalchemy следующим образом:

Base = declarative_base()

class Association(Base):
 __tablename__ = 'association'

 prev_id = Column(Integer, ForeignKey('line.id'), primary_key=True)                            
 next_id = Column(Integer, ForeignKey('line.id'), primary_key=True)


class Line(Base):
 __tablename__ = 'line'

 id = Column(Integer, primary_key = True)
 text = Column(Text)
 condition = Column(Text)
 action = Column(Text)

 next_lines = relationship(Association, backref="prev_lines")



class Root(Base):
 __tablename__ = 'root'

 name = Column(String, primary_key = True)
 start_line_id = Column(Integer, ForeignKey('line.id'))

 start_line = relationship('Line')

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

Вы знаете, как я могу исправить это?


person mike    schedule 14.11.2010    source источник
comment
Я попробовал это: next_lines = отношение (ассоциация, backref = prev_lines, primaryjoin = id == ассоциация.next_id) prev_lines = отношение (ассоциация, backref = next_lines, primaryjoin = id == ассоциация. prev_id) Теперь это не вызывает никаких ошибок. Это правильное решение? Или это вызовет другие проблемы?   -  person mike    schedule 14.11.2010


Ответы (1)


Вам просто нужно:

prev_lines = relationship(
    Association,
    backref="next_lines",
    primaryjoin=id==Association.prev_id)

Поскольку это указывает обратную ссылку next_lines, нет необходимости иметь связь next_lines.

Вы также можете сделать это, используя параметр remote_side отношения: http://www.sqlalchemy.org/trac/browser/examples/adjacency_list/adjacency_list.py

person Nathan Villaescusa    schedule 17.11.2010