web-dev-qa-db-ja.com

SQLAlchemyフィルタークエリ "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)

解決策はありますか?

12
user1599438

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行を返すため、実際には必要とはまったく異なります。

21
Paul Lo

あなたは使用を試みることができます any _()

あなたの場合、それは次のようになります:

from sqlalchemy import any_

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