我在用着SA 0.6.6, Python 2.66 and Postgres 8.3.
我有某些查询需要一些复杂的安全检查,可以使用WITH RECURSIVE
询问。我想做的是将文本查询与查询对象结合起来,这样我就可以根据需要应用过滤器。
我最初的想法是创建文本查询作为子查询,然后将其与用户的查询和过滤器结合起来。不幸的是,这不起作用。
subquery = session.query(sharedFilterAlias).\
from_statement(sharedFilterQuery).subquery()
这会导致此错误:
AttributeError: 'Annotated_TextClause' object has no attribute 'alias'
有没有办法将文本查询与 SQLAlchemy 的查询对象结合起来?
经过一段时间没有答案后我发布到 SA Google 群组 https://groups.google.com/forum/?fromgroups#!topic/sqlalchemy/VAttoxkLlXw, where 迈克尔·拜尔 http://techspot.zzzeek.org/他亲自为我指明了正确的方向。
答案是将我的文本查询转换为 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()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)