在纯 postgres 中我们可以这样写:
SELECT * FROM my_table WHERE 10000 = ANY (array_field);
或
SELECT * FROM my_table WHERE 10000 = ALL (array_field);
如何在没有原始 sql 的情况下借助 sqlalchemy 做同样的事情?
最佳答案
a = ANY(b_array)
相当于a
<强> IN
(elements_of_b_array)
1.
因此您可以使用 in_()
method .
我不记得曾经用过 a = ALL(b_array)
在我使用 PostgreSQL 的这些年里。你有吗?
如果您正在处理一个数组列,并且想要测试它是否包含该列中的给定元素(或给定数组的所有元素),那么您可以使用PostgreSQL array operators。 @>
( contains
) 或更恰本地说是反向兄弟 <@
(is contained by
)。
数组运算符的优势在于它们可以通过数组列上的 GIN 索引 得到支持(与 ANY
构造不同)。
你的 SQL 语句:
SELECT * FROM my_table WHERE 10000 = ANY (array_field);
(几乎)1 等同于
SELECT * FROM my_table WHERE 10000 <@ array_field;
我不是 SQLAlchemy 专家,但根据 tutorial in the SQLAlchemy manual ,您可以使用任何运算符:
If you have come across an operator which really isn’t available, you can always use the
op()
method; this generates whatever operator you need:>>> print users.c.name.op('tiddlywinks')('foo') users.name tiddlywinks :name_1
大胆强调我的。您的语句在 SQLA 中可能如下所示:
s = select([my_table], array_field.op('@>')('ARRAY[10000]'))
或者使用 PostgreSQL 数组值的替代输入语法:
s = select([my_table], array_field.op('@>') (cast('{10000}', int[])))
1 NULL 处理有细微的差别:
SELECT '{NULL}'::int[] <@ ... -- that's an array with a single NULL element
总是产生 FALSE
.
SELECT NULL IN (...)
SELECT NULL = ANY (...)
SELECT NULL::int[] <@ ...
始终产生 NULL
.
如果您不打算查询 NULL
值,你可以忽略它。
关于python - SQLAlchemy:如何过滤 PgArray 列类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10344468/