繁体   English   中英

SQLAlchemy 过滤器查询“列 LIKE ANY(数组)”

[英]SQLAlchemy filter query “column LIKE ANY (array)”

嗨 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)

任何解决方案?

使用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是一个列表(见这里),例如, query(MyTable).filter(MyTable.my_list_column.any(name='abc'))如果该行的my_list_column列(列表)中的任何元素以 'abc' 命名,则返回MyTable行,因此它实际上与您的需要大不相同。

您可以尝试使用any_()

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

from sqlalchemy import any_

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM