在使用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
任何建议都将不胜感激。
答案 0 :(得分:3)
您的问题是您正在向后使用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')