包含多个值之一的数组的 SQLAlchemy 查询

J-b*_*bob 10 postgresql sqlalchemy

我想我可以在互联网上的某个地方找到答案,但我似乎错过了。您可以在表中查询数组列包含特定值的所有行:

MyModel.query.filter(Mymodel.arrayField.contains(['someValue'])
Run Code Online (Sandbox Code Playgroud)

您可以输入多个值,以便数组必须包含所有指定的值:

MyModel.query.filter(Mymodel.arrayField.contains(['someValue', 'anotherValue'])
Run Code Online (Sandbox Code Playgroud)

但是查询以及数组包含至少一个指定值的位置呢?也就是说,一个查询将返回arrayField包含'someValue'或的行'anotherValue',可能两者都有,但不一定两者都有。

我该怎么做?

sna*_*erb 7

这里的 Postgresql 概念是重叠数组,使用&&运算符实现:

\n
test# SELECT ARRAY[\'a\', \'x\'] && ARRAY[\'a\', \'b\', \'c\'] AS overlaps;\n overlaps \n\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\n t\n(1 row)\n\ntest# SELECT ARRAY[\'q\', \'x\'] && ARRAY[\'a\', \'b\', \'c\'] AS overlaps;\n overlaps \n\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\n f\n(1 row)\n
Run Code Online (Sandbox Code Playgroud)\n

SQLAlchemy在 Postgresql 方言中的ARRAY类型上提供了重叠方法,该方法实现&&方法,该方法实现了.

\n

ORM 查询检查至少包含 和 之一的列,\'a\'如下\'z\'所示

\n
test# SELECT ARRAY[\'a\', \'x\'] && ARRAY[\'a\', \'b\', \'c\'] AS overlaps;\n overlaps \n\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\n t\n(1 row)\n\ntest# SELECT ARRAY[\'q\', \'x\'] && ARRAY[\'a\', \'b\', \'c\'] AS overlaps;\n overlaps \n\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\n f\n(1 row)\n
Run Code Online (Sandbox Code Playgroud)\n

或 SQLAlchemy 2.0 风格:

\n
session.query(MyModel).filter(MyModel.array_field.overlap([\'a\', \'z\']))\n
Run Code Online (Sandbox Code Playgroud)\n

或者如果您更喜欢接近 Postgres 语法:

\n
select(MyModel).where(MyModel.array_field.overlap([\'a\', \'z\']))\n
Run Code Online (Sandbox Code Playgroud)\n