Python SQLAlchemy不在带有参数的子句中

Python SQLAlchemy不在带有参数的子句中,python,postgresql,sqlalchemy,Python,Postgresql,Sqlalchemy,在使用Python连接到PostgreSQL数据库时,我们使用的是SQLAlchemy,而不是ORM。我们有一个表,其中一列是字符串数组,我们希望检索数组列中不存在输入参数的所有行。请注意,我们可以检索SQLAlchemy的其他查询的结果,因此问题必须在查询创建中 我们需要实现的SQL如下所示: select pk from table where 'paramstring' NOT IN(array_column); -- returns several rows def get_not_m

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

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

select pk from table where 'paramstring' NOT IN(array_column);
-- returns several rows
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
我们在Python中提供的函数如下所示:

select pk from table where 'paramstring' NOT IN(array_column);
-- returns several rows
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

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

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

换句话说,您所拥有的是生成:

从数组_列不在的表中选择主键(paramstring);
根据SQLAlchemy,它还不支持查询Postgres数组列中的项

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

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

谢谢我编辑了这个问题以删除不必要的信息并更新代码。正如您所说的,对in进行否定应该是可行的,但是显然参数没有正确地传入。