【问题标题】:SQLAlchemy - Combine Textual query with a filterSQLAlchemy - 将文本查询与过滤器相结合
【发布时间】:2011-07-25 06:09:23
【问题描述】:

我正在使用 SA 0.6.6Python 2.66Postgres 8.3

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

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

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

这会导致这个错误:

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

是否可以将文本查询与 SQLAlchemy 的查询对象结合起来?

【问题讨论】:

    标签: python string text filter sqlalchemy


    【解决方案1】:

    我很幸运地将select_from 方法链接到查询方法的子查询。这样的事情可能会奏效;但我无法确定更多关于您的数据模型和您尝试生成的 SQL 的信息。

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

    【讨论】:

    • 感谢 Philip 的建议,但 select_from 接受映射实体或 FromClause 对象,而不是文本。我的数据模型与如何将文本查询与过滤器相结合的问题并不真正相关。
    【解决方案2】:

    一段时间过去了,I posted to the SA Google Group 没有答案,Michael 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()
    

    【讨论】:

      猜你喜欢
      • 2016-06-09
      • 1970-01-01
      • 2021-08-11
      • 2015-01-15
      • 1970-01-01
      • 2016-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多