TypeError:is_in()缺少1个必需的位置参数:'self'

时间:2019-07-05 08:24:15

标签: python sqlalchemy common-table-expression recursive-query

此职位的第一标题: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的一个重要功能,因为我试图在类而不是实例之一上进行方法调用。

谢谢

0 个答案:

没有答案