Cor*_*gan 3 python string text sqlalchemy filter
我使用的是SA 0.6.6,Python 2.66和Postgres 8.3.
我有一些查询需要一些可以通过WITH RECURSIVE查询处理的复杂安全检查.我想要做的是将文本查询与查询对象结合起来,以便我可以根据需要应用过滤器.
我最初的想法是将我的文本查询创建为子查询,然后将其与用户的查询和过滤器相结合.不幸的是,这不起作用.
subquery = session.query(sharedFilterAlias).\
from_statement(sharedFilterQuery).subquery()
Run Code Online (Sandbox Code Playgroud)
这会导致此错误:
AttributeError: 'Annotated_TextClause' object has no attribute 'alias'
Run Code Online (Sandbox Code Playgroud)
反正将文本查询与SQLAlchemy的查询对象结合起来了吗?
经过一段时间没有回答,我发布了SA谷歌集团,迈克尔拜耳本人让我朝着正确的方向前进.
答案是将我的文本查询转换为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()
Run Code Online (Sandbox Code Playgroud)