python - SQLAlchemy:如何过滤 PgArray 列类型?

标签 python sql postgresql sqlalchemy

在纯 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/

相关文章:

python - doctest 调用哪些函数的顺序?

python - PicklingError : Can't pickle <class . ..> : it's not the same object as . .. 在 GAE 中

python - 使用 Pandas 提高时间序列数据的采样率

Python - 检查文件名的扩展名

sql - 检查不平等的有效方法

java - 级联删除在更大数据集上的性能下降,这可能是由于缺乏索引造成的吗?

php - 来自 Postgres SELECT SETOF 函数的重复记录

sql - 使用唯一递增值更新表中的 int 列

c# - 从 SqlDataReader 获取 byte[]?

sql - Postgresql-将 10 秒条目的表压缩为 1 分钟条目的最佳方法