python - 带有参数的 SQLAlchemy NOT IN 子句

标签 python postgresql sqlalchemy

在使用 Python 连接到 PostgreSQL 数据库时,我们使用的是 SQLAlchemy,而不是 ORM。我们有一个表,其中一列是字符串数组,我们想要检索数组列中不存在输入参数的所有行。请注意,我们可以检索 SQLAlchemy 的其他查询的结果,因此问题必须出在查询创建中。

我们需要实现的 SQL 如下所示:

select pk from table where 'paramstring' NOT IN(array_column);
-- returns several rows

我们在Python中想出的函数是这样的:

def get_not_matching(param):

    select_statement = select([the_table.c.pk]).where(
        ~data_table.c.array_column.in_([param])
    )

    #... execute and retrieve ResultProxy
    # the result_set comes back empty

如有任何建议,我们将不胜感激。

最佳答案

您的问题是您反向使用了 in 语句。它用于查找具有列表中的字段的行,而不是查找具有包含字符串的列表的行。

换句话说,你所拥有的正在产生:

select pk from table where array_column NOT IN(paramstring);

根据 https://groups.google.com/forum/?fromgroups=#!topic/sqlalchemy/QAfTDrNYaFI SQLAlchemy 尚不支持查询 Postgres 数组列中的项目。

他们建议使用原始过滤器来完成您想要的:

select([the_table.c.pk]).where(text("array_column @> ARRAY[:element_value]"))).params(element_value='paramstring')

关于python - 带有参数的 SQLAlchemy NOT IN 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13019205/

相关文章:

python - 在 SQLAlchemy 中注释 `exists` 子查询

flask - 自引用关联关系 SQLalchemy

python - 在 SQLAlchemy/Elixir 中选择不同的列值

python - 如果有人兑换积分,如何获取信息?

python - 将不同长度的列表列表转换为 numpy 数组

python - BOTO3 DynamoDB 错误 : delete an item from a LIST attribute in a dynamodb table

sql滑动窗口 - 在区间内找到最大值

python - 如果更改端口,容器化 flask 应用程序不会加载

postgresql - 集群 PostgreSQL 集群

PostgreSQL:为复合类型中的字段创建索引?