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

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

#!/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: не Может определить соединение между 'устройством' и 'parent_device'; таблицы имеют больше чем одно ограничительное отношение внешнего ключа между ними. Укажите 'onclause' этого соединения явно.

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

15
задан kay 8 December 2012 в 00:36
поделиться

2 ответа

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

q = db_session.query(Device, ParentDevice)\
    .outerjoin(
                  (ParentDevice, Device.parent_device_id==ParentDevice.device_id)
              )
7
ответ дан 1 December 2019 в 04:58
поделиться

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

3
ответ дан 1 December 2019 в 04:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: