Не одинаковое количество столбцов в рекурсивном запросе CTE с использованием sqlalchemy - PullRequest
0 голосов
/ 07 июля 2019

Я создал этот рекурсивный запрос:

element0 = aliased(Territoire)
    sub_territories = session.query(element0, element0.id). \
        filter(element0.id == 1). \
        filter(element0.scale != 'Region'). \
        cte(name='sub_territories', recursive=True)

    st_alias = aliased(sub_territories)
    relation = aliased(parent_child)
    porteur = aliased(Territoire)

    corps = session.query(porteur, relation.c.child_id). \
        join(porteur, porteur.id == relation.c.child_id). \
        join(st_alias, relation.c.parent_id == st_alias.c.id). \
        filter(st_alias.c.scale != 'Region')

    sub_territories = sub_territories.union(corps)

, который должен рекурсивно дать всем дочерним элементам element0 остановку на уровне «Регион» (элементы связаны отношением «многие ко многим»), причем каждый элемент имеет уровень, который может быть: мир, страна, регион, город ...

вот код, который может вам помочь:

class Territoire(Base):
    __tablename__ = 'territoire'
    id = Column(Integer, primary_key=True)
    name = Column(String)
    scale = Column(String)

    children = relationship(
        'Territoire',
        secondary=parent_child,
        back_populates='parents',
        primaryjoin=parent_child.c.parent_id == id,
        secondaryjoin=parent_child.c.child_id == id,

    )

    parents = relationship(
        'Territoire',
        secondary=parent_child,
        primaryjoin=parent_child.c.child_id==id,
        secondaryjoin=parent_child.c.parent_id==id,
        back_populates='children'
    )

и таблица:

parent_child = Table('parent_child', Base.metadata,
                     Column('parent_id', ForeignKey('territoire.id'), primary_key=True),
                     Column('child_id', ForeignKey('territoire.id'), primary_key=True))

сообщение об ошибке:

sqlalchemy.exc.ArgumentError: Все выбираемые элементы передаются в CompoundSelect должно иметь одинаковое количество столбцов; выберите # 1 имеет 3 столбца, выберите # 2 имеет 4

Я не понимаю эту ошибку, поскольку 2 запроса CTE имеют для 1-го элемента объект Territoire и для 2-го элемента int (id).

спасибо

...