此职位的第一标题:AttributeError:“ MTObject”对象没有属性“可散列”
我正在尝试创建一个递归CTE查询,但是我遇到了麻烦。 区域对象是使用sqlalchemy映射到表的对象,它继承了fromp 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:查询会扫描从id为1的领土开始的所有领土,并通过is_in函数向下扫描,该函数会判断一个领土是否为子领土。
谢谢
编辑 我有一个更好的代码:
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()
但是我得到这个错误: TypeError:is_in()缺少1个必需的位置参数:'self'
我想我错过了sqlalchemy的一个重要功能,因为我试图在类而不是实例之一上进行方法调用。
谢谢