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',可能两者都有,但不一定两者都有。
我该怎么做?
这里的 Postgresql 概念是重叠数组,使用&&运算符实现:
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)\nRun Code Online (Sandbox Code Playgroud)\nSQLAlchemy在 Postgresql 方言中的ARRAY类型上提供了重叠方法,该方法实现&&方法,该方法实现了.
ORM 查询检查至少包含 和 之一的列,\'a\'如下\'z\'所示
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)\nRun Code Online (Sandbox Code Playgroud)\n或 SQLAlchemy 2.0 风格:
\nsession.query(MyModel).filter(MyModel.array_field.overlap([\'a\', \'z\']))\nRun Code Online (Sandbox Code Playgroud)\n或者如果您更喜欢接近 Postgres 语法:
\nselect(MyModel).where(MyModel.array_field.overlap([\'a\', \'z\']))\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
3114 次 |
| 最近记录: |