一尘不染

SQLAlchemy:如何筛选PgArray列类型?

sql

在纯postgres中,我们可以编写:

SELECT * FROM my_table WHERE 10000 = ANY (array_field);

或者

SELECT * FROM my_table WHERE 10000 = ALL (array_field);

没有原始sql的情况下如何在sqlalchemy的帮助下进行相同的操作?


阅读 248

收藏
2021-03-10

共1个答案

一尘不染

a = ANY(b_array)等于1。a IN(elements_of_b_array)

因此,您可以使用该in_()方法

我不记得曾经使用a = ALL(b_array)PostgreSQL多年。你?


如果您要处理 数组列, 并想测试该 列中
是否包含给定元素(或给定数组的所有元素),则可以利用PostgreSQL数组运算符 @>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的专家,但是根据SQLAlchemy手册中教程,您可以使用任何运算符:

如果遇到确实不可用的运算符,则可以始终使用该 op() 方法。这将生成您需要的任何运算符:

>>> 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值,则可以忽略它。

2021-03-10