SQLAlchemy过滤查询"列LIKE ANY(数组)"

时间:2015-02-02 03:26:18

标签: python sqlalchemy any

您好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)

任何解决方案?

2 个答案:

答案 0 :(得分:16)

使用or_()like(),以下代码可以满足您的需求:

from sqlalchemy import or_

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

从上面的代码生成条件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列(列表)中的任何元素以'abc'命名,则返回my_list_column行,因此它实际上与您的需求完全不同。

答案 1 :(得分:2)

您可以尝试使用any_()

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

from sqlalchemy import any_

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