使用Pyscopg2,如何将Python列表传递给SQL语句using the ANY Operator?
正常工作SQL读取(See SQL Fiddle):
SELECT * FROM student WHERE id NOT IN (3);
使用Psycopg2如下:
Psycopg2:查询1
以下查询未通过psycopg2.ProgrammingError: syntax error at or near "ANY"
id_list = [2,3,4]
cursor.execute("SELECT * FROM student WHERE id NOT IN ANY(%s)) %(id_list);
Psycopg2:查询2
下面的查询不会抛出错误,但会产生错误的结果,因为它不会排除列表中的ID。它的行为就像它的Equal To运算符一样,或者像IN
NOT IN
语句一样具体,而我需要id_list = [2,3,4]
cursor.execute("SELECT * FROM student WHERE id != ANY(%s)), (id_list,);
{{1}}
此外,在我的搜索中,我遇到了pyscopg2 extension SQL_IN。可以在这种情况下使用吗?如果是这样,我该如何使用它?
答案 0 :(得分:3)
当你这样做时
select 2 != any(array[2,3,4]);
?column?
----------
t
2
将与所有数组项进行比较,如果2
不相等,则评估为true
。
使用not id = any(array[2,3,4])
select not 1 = any(array[2,3,4]);
?column?
----------
t
select not 2 = any(array[2,3,4]);
?column?
----------
f
或!= all
select 1 != all(array[2,3,4]);
?column?
----------
t
select 2 != all(array[2,3,4]);
?column?
----------
f
答案 1 :(得分:0)
SQL_IN
适配器可以通过调整元组来使用IN
运算符,而不是列表(列表适用于PostgreSQL数组)。要使查询起作用,您应该按如下方式编写代码:
id_list = (2,3,4) # Note the tuple!
cursor.execute("SELECT * FROM student WHERE id NOT IN %s", (id_list,));