ПЕРВЫЙ НАЗВАНИЕ ЭТОГО ПОЧТЫ: 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, потому что я пытаюсь получить вызов метода для класса, а не для его экземпляра.
спасибо