【问题标题】:SQLAlchemy filter query "column LIKE ANY (array)"SQLAlchemy 过滤器查询“列 LIKE ANY(数组)”
【发布时间】:2015-03-31 23:36:59
【问题描述】:

您好 SQLAlchemy 专家,这里有一个棘手的问题:

我正在尝试编写解析为以下内容的查询:

SELECT * FROM MyTable where my_column LIKE ANY (array['a%', 'b%'])

使用 SQLAlchemy:

foo = ['a%', 'b%']

# this works, but is dirty and silly
DBSession().query(MyTable).filter("my_column LIKE ANY (array[" + ", ".join(["'" + f + "'" for f in token.tree_filters]) + "])")

# something like this should work (according to documentation), but doesn't (throws "AttributeError: Neither 'AnnotatedColumn' object nor 'Comparator' object has an attribute 'any'"
DBSession().query(MyTable).filter(MyTable.my_column.any(foo, operator=operators.like)

有什么解决办法吗?

【问题讨论】:

标签: python sqlalchemy any


【解决方案1】:

使用or_()like(),下面的代码应该可以很好地满足你的需要:

from sqlalchemy import or_

foo = ['a%', 'b%']
DBSession().query(MyTable).filter(or_(*[MyTable.my_column.like(name) for name in foo]))

一个 where 条件 WHERE my_column LIKE 'a%' OR my_column LIKE 'b%' 将从上面的代码生成。

至于为什么你的any() 不起作用,我认为是因为它要求my_column 是一个列表(参见here),例如,query(MyTable).filter(MyTable.my_list_column.any(name='abc')) 是返回MyTable 行如果该行的my_list_column 列(列表)中的任何元素以“abc”命名,那么它实际上与您的需要完全不同。

【讨论】:

  • 感谢您的回复。使用 or_() 是我想到的另一种解决方案,但不希望这样做,因为它会使查询变得很长。但我想仍然比我的肮脏解决方案要好。
  • @user1599438 恐怕你需要在这种情况下使用or_(),实际上它并没有那么长:p
【解决方案2】:

你可以尝试使用any_()

在你的情况下,它看起来像这样:

from sqlalchemy import any_

foo = ['a%', 'b%']
DBSession().query(MyTable).filter(MyTable.my_column.like(any_(foo)))

【讨论】:

    猜你喜欢
    • 2021-12-19
    • 1970-01-01
    • 2015-01-15
    • 1970-01-01
    • 1970-01-01
    • 2014-09-08
    • 2021-08-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多