SQLAlchemy 查询包含多个值中任意一个的数组

2023-12-22

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

MyModel.query.filter(Mymodel.arrayField.contains(['someValue'])

您可以输入多个值,使得数组必须包含all指定值:

MyModel.query.filter(Mymodel.arrayField.contains(['someValue', 'anotherValue'])

但是查询数组包含的位置又如何呢?最后一个指定值。也就是说,一个查询将返回行,其中arrayField包含'someValue' or 'anotherValue',也许两者都有,但不一定两者都有。

我该怎么做呢?


这里的Postgresql概念是重叠 https://www.postgresql.org/docs/13/functions-array.html数组,使用实现&&操作员:

test# SELECT ARRAY['a', 'x'] && ARRAY['a', 'b', 'c'] AS overlaps;
 overlaps 
══════════
 t
(1 row)

test# SELECT ARRAY['q', 'x'] && ARRAY['a', 'b', 'c'] AS overlaps;
 overlaps 
══════════
 f
(1 row)

SQLAlchemy 提供了overlap https://docs.sqlalchemy.org/en/14/dialects/postgresql.html#sqlalchemy.dialects.postgresql.ARRAY.Comparator.overlap方法上的ARRAY https://docs.sqlalchemy.org/en/14/dialects/postgresql.html#sqlalchemy.dialects.postgresql.ARRAY输入实现的 Postgresql 方言&&.

ORM 查询检查至少包含以下之一的列'a' and 'z'看起来像

session.query(MyModel).filter(MyModel.array_field.overlap(['a', 'z']))

或 SQLAlchemy 2.0 风格:

select(MyModel).where(MyModel.array_field.overlap(['a', 'z']))

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

select(MyModel).where(MyModel.array_field.op('&&')(['a', 'z']))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQLAlchemy 查询包含多个值中任意一个的数组 的相关文章

随机推荐