Что делать, если у меня было что-то вроде двойного связанного списка в реляционной базе данных, например:Использование SQLAlchemy с несколькими автореферентных внешних ключей
node_id left_id right_id
1 null 2
2 1 3
3 2 null
Тогда у меня есть некоторый SQLAlchemy код вроде следующего:
class NodeClass(Base):
__tablename__ = 'nodes_table'
node_id = Column(Integer, primary_key=True)
left_id = Column(Integer, ForeignKey('nodes_table.node_id'))
right_id = Column(Integer, ForeignKey('nodes_table.node_id'))
left = relationship('NodeClass') # Wrong
right = relationship('NodeClass') # Wrong
Если у меня есть node_id 2, и я звоню NodeClass.left
Я хотел бы получить node_id 1 взамен. Как я могу настроить отношения SQLAlchemy таким образом?
ОБНОВЛЕНИЕ:
дам второй пример. Рассмотрим таблицу людей, и у каждого человека есть мать и отец.
person_id mother_id father_id
1 null null
2 null null
3 1 2
Код SQLAlchemy:
class PersonClass(Base):
__tablename__ = 'persons_table'
person_id = Column(Integer, primary_key=True)
mother_id = Column(Integer, ForeignKey('persons_table.person_id'))
father_id = Column(Integer, ForeignKey('persons_table.person_id'))
mother = relation('PersonClass') # Wrong
father = relation('PersonClass') # Wrong
двойной связанный список примеров был самый простой пример, который я мог придумать. На самом деле у меня есть более сложные данные, и я не могу изменить схему базы данных. Основная проблема, с которой я столкнулся, заключалась в множественных внешних ссылочных ключах, но вы удалили их из проблемы, поэтому ваше решение напрямую не применимо. Тем не менее, это дает мне хорошую отправную точку. – Buttons840
@ Buttons840: ваш второй пример довольно прост в ответе: для каждого отношения (отец/месяц или слева/справа) вам нужно указать условие соединения с помощью * primaryjoin *. В ближайшее время я добавлю ответ. – van
У меня проблемы с primaryjoin. Поскольку оба операнда на equals (==) являются NodeClass, как он знает, какой NodeClass является текущим узлом, а какой NodeClass является связанным узлом? Когда я прошу «левый», его можно интерпретировать как «дать мне другой узел, id которого равен моему left_id» или «дать мне другой узел, у которого left_id равен моему id». Все наоборот. Я пробовал это, и он не работает.Я думаю, мне нужно использовать таблицу с псевдонимом, но я не знаю, как это сделать в декларативном классе. – Buttons840