Как присоединиться к той же таблице в sqlalchemy

Я пытаюсь присоединиться к той же таблице в sqlalchemy. Это минимальная версия того, что я пробовал:

#!/usr/bin/env python import sqlalchemy as sa from sqlalchemy import create_engine from sqlalchemy.orm import mapper, sessionmaker, aliased engine = create_engine('sqlite:///:memory:', echo=True) metadata = sa.MetaData() device_table = sa.Table("device", metadata, sa.Column("device_id", sa.Integer, primary_key=True), sa.Column("name", sa.String(255), nullable=False), sa.Column("parent_device_id", sa.Integer, sa.ForeignKey('device.device_id')), ) class Device(object): device_id = None def __init__(self, name, parent_device_id=None): self.name = name self.parent_device_id = parent_device_id def __repr__(self): return "<Device(%s, '%s', %s)>" % (self.device_id, self.name, self.parent_device_id ) mapper(Device, device_table) metadata.create_all(engine) db_session = sessionmaker(bind=engine)() parent = Device('parent') db_session.add(parent) db_session.commit() child = Device('child', parent.device_id) db_session.add(child) db_session.commit() ParentDevice = aliased(Device, name='parent_device') q = db_session.query(Device, ParentDevice)\ .outerjoin(ParentDevice, Device.parent_device_id==ParentDevice.device_id) print list(q) 

Это дает мне эту ошибку:

ArgumentError: невозможно определить соединение между 'device' и 'parent_device'; таблицы имеют более одного отношения ограничения внешнего ключа между ними. Пожалуйста, укажите «onclause» этого соединения явно.

Но я указываю onclause для соединения. Как я должен это делать?

2 Solutions collect form web for “Как присоединиться к той же таблице в sqlalchemy”

Для query.[outer]join вы указываете в качестве списка объединений (который отличается от expression.[outer]join .) Поэтому мне нужно было поместить 2 элемента соединения, таблицу и onclause в кортеж, например :

 q = db_session.query(Device, ParentDevice)\ .outerjoin( (ParentDevice, Device.parent_device_id==ParentDevice.device_id) ) 

Ваш сопоставитель должен указать соединение между двумя элементами, вот пример: отношения списка смежности .

  • SQLAlchemy - максимальная длина столбца
  • Передача контекста приложения в пользовательский конвертер с использованием шаблона Application Factory
  • Уникальная sqlalchemy для нескольких столбцов
  • Как удалить таблицу в SQLAlchemy?
  • Как сделать соединение mysql, требующее CA-CERT с sqlalchemy или SQLObject
  • Как установить одно-многое и одно отношение в одно и то же время в Flask-SQLAlchemy?
  • Использование меток sqlalchemy python
  • SQLAlchemy: гибридное выражение с отношением
  • Python - лучший язык программирования в мире.