SQLAlchemy - 将文本查询与过滤器结合使用

时间:2011-03-29 12:27:38

标签: python string text filter sqlalchemy

我正在使用 SA 0.6.6 Python 2.66 Postgres 8.3

我有一些查询需要稍微复杂的安全检查,可以通过WITH RECURSIVE查询来处理。我要做的是将文本查询与查询对象结合起来,以便我可以根据需要应用过滤器。

我最初的想法是将我的文本查询创建为子查询,然后将其与用户的查询和过滤器相结合。不幸的是,这不起作用。

subquery = session.query(sharedFilterAlias).\
                   from_statement(sharedFilterQuery).subquery()

这会导致此错误:

AttributeError: 'Annotated_TextClause' object has no attribute 'alias'

有没有将文本查询与SQLAlchemy的查询对象结合起来?

2 个答案:

答案 0 :(得分:6)

过了一段时间没有回答I posted to the SA Google GroupMichael Bayer他自己把我指向正确的方向。

答案是将我的文本查询转换为SA文本子句。然后使用in_运算符。这是成品的一个例子:

sharedFilterQuery = '''WITH    RECURSIVE
        q AS
        (
        SELECT  h.*
        FROM    "Selection"."FilterFolder" h
        join "Selection"."Filter" f
        on f."filterFolderId" = h.id
        WHERE   f.id = :filterId 
        UNION
        SELECT  hp.*
        FROM    q
        JOIN    "Selection"."FilterFolder" hp
        ON      hp.id = q."parentFolderId"
        )
SELECT  f.id
FROM    "Selection"."Filter" f
where f.id = :filterId and
(f."createdByUserId" = 1 or
exists(select 1 from q where "isShared" = TRUE LIMIT 1))
'''

inClause = text(sharedFilterQuery,bindparams=[bindparam('filterId',filterId)])

f = session.query(Filter)\
.filter(Filter.description == None)\
.filter(Filter.id.in_(inClause)).first()

答案 1 :(得分:2)

我很幸运,子查询将select_from方法链接到查询方法。这样的事可能有用;但是不了解您的数据模型以及您尝试生成的SQL我不能确定。

results = session.query(sharedFilterAlias).select_from(sharedFilterQuery).all()