SQLAlchemy рекурсивный запрос CTE не возвращает элементы, не являющиеся столбцами? - PullRequest
2 голосов
/ 14 января 2020

У меня есть следующий класс:

class Catalog(Base):
    __tablename__ = 'catalog'
    id = Column(String, primary_key=True)
    parentid = Column(String, ForeignKey('catalog.id'))
    name = Column(String)
    parent = relationship("Catalog", remote_side=[id])]

    @property
    def operative_name_stamp(self):
        node = self
        while not node.name and node.parent:
            node = node.parent
        return node.name

Если я сделаю какой-нибудь рекурсивный запрос на основе CTE:

hierarchy = session.query(
        Catalog, literal(0).label('level'))\
        .filter(Catalog.parentid == null())\
        .cte(name="hierarchy", recursive=True)

parent = aliased(hierarchy, name="p")
children = aliased(Catalog, name="c")
hierarchy = hierarchy.union_all(
            session.query(
                children,
                (parent.c.level + 1).label("level"))
            .filter(children.parentid == parent.c.id))

result = session.query(Catalog, hierarchy.c.level)\
        .select_entity_from(hierarchy).all()

Это даст мне только иерархию кортежей с членами столбца, но элемент без столбца - operative_name_stamp - отсутствует.

Есть ли способ включить эти элементы в результат?

1 Ответ

1 голос
/ 21 января 2020

Эту проблему легко решить, используя словарь вместо списка в качестве возвращаемого результата. Таким образом, вы можете буквально «искать» все что угодно по первичным ключам. Это напоминает мне о том, насколько сложной может быть жизнь!

...