Ошибка типа: is_in () отсутствует 1 обязательный позиционный аргумент: 'self' - PullRequest
0 голосов
/ 05 июля 2019

ПЕРВЫЙ НАЗВАНИЕ ЭТОГО ПОЧТЫ: AttributeError: у объекта 'MTObject' нет атрибута 'hashable'

Я пытаюсь создать рекурсивный запрос CTE, но я застрял. Территория объекта - это объект, сопоставленный с таблицей с использованием sqlalchemy, и он наследует от p MTObject, который является общим суперклассом. запрос приведен ниже:

sub_territories = cg.session.query(cast(Territory, MTObject).label('terr'),
                                       literal(Territory.id).label('id'),
                                       cast(Territory.scale, Text).label('scale')). \
        filter(Territory.id == 1). \
        filter(Territory.scale != 'Country'). \
        cte(name='sub_territories', recursive=True)
    sub_territories_alias = aliased(sub_territories, name="pr")
    fils_alias = aliased(Territory, name="p")
    sub_territories = sub_territories.union(
        cg.session.query(fils_alias, fils_alias.id, fils_alias.scale). \
            filter(fils_alias.is_in(sub_territories_alias.terr))
    )
    q = cg.session.query(sub_territories.c.id).all()

Объект Territory преобразуется в MTObject, я также пробовал Territory, но это ничего не меняет в проблеме. Ошибка возникает при вызове метода is_in, но этот метод используется во всей программе, и кажется, что работать в другом месте: я думаю, что это работает правильно; скорее я думаю, что ошибка исходит из моего запроса. Метод is_in принимает аргумент типа mtobject.

Является ли мой запрос правильным? у вас есть представление о том, что происходит не так? ps: запрос сканирует все территории, начинающиеся с территории с идентификатором 1, и опускается вниз благодаря функции is_in, которая сообщает, является ли территория дочерней, если другая.

спасибо

EDIT У меня есть лучший код:

sub_territories = cg.session.query(literal(Territory.id).label('id'),
                                       cast(Territory.scale, Text).label('scale')). \
        filter(Territory.id == 1). \
        filter(Territory.scale != 'Country'). \
        cte(name='sub_territories', recursive=True)
    sub_territories_alias = aliased(sub_territories, name="pr")
    fils_alias = aliased(Territory, name="p")
    sub_territories = sub_territories.union(
        cg.session.query(fils_alias.id, fils_alias.scale).
            join(Territory, Territory.id == sub_territories_alias.c.id).
            filter(fils_alias.is_in(Territory).
                   filter(sub_territories_alias.c.scale!='Country'))
    )
    q = cg.session.query(sub_territories.id).all()

но я получаю эту ошибку: Ошибка типа: is_in () отсутствует 1 обязательный позиционный аргумент: 'self'

Я думаю, что мне не хватает важной функции sqlalchemy, потому что я пытаюсь получить вызов метода для класса, а не для его экземпляра.

спасибо

...