当我尝试使用 psycopg2 对我的表执行多次更新时遇到问题。当我运行这个查询
query ='UPDATE table SET isValid = false where id = %s and customerid = %s and filed in %s'
data = (id,customerid, fieldlist)
cursor.execute(query, data)
其中 id 和 customer id 都是 guid,fieldlist 是一个字符串列表 我在“ARRAY”处或附近收到此错误语法错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
psycopg2.errors.SyntaxError: syntax error at or near "ARRAY"
LINE 1: ...alse where id = 2 and customerid = 1 and filed in ARRAY['22/11/20', '23...
^
我知道问题出在我的
fieldlist
变量中,但我找不到解决问题的聪明方法。
谢谢
Per
psycopg2
文档Type adaptation:
list ARRAY 列表适配
列表适应:
Python 列表转换为 PostgreSQL 数组:
cur.mogrify("SELECT %s;", ([10, 20, 30], ))
'选择数组[10,20,30];'
注意
您可以使用 Python 列表作为使用 PostgreSQL ANY 运算符的 IN 运算符的参数。
ids = [10, 20, 30] cur.execute("SELECT * FROM data WHERE id = ANY(%s);", (ids,))
此外,ANY 也可以处理空列表,而 IN () 是 SQL 语法错误。
注意
从 PostgreSQL 读回,数组按预期转换为 Python 对象列表,但前提是项目是已知类型。未知类型的数组以数据库的形式返回(例如 {a,b,c})。如果您想将项目转换为 Python 对象,您可以轻松地为未知类型的数组创建一个类型转换程序。
所以:
... filed = ANY(%s) ...
由于您的
fieldlist
变量是 ARRAY 类型,但您将其用作元组列表。你必须使用tuple(fieldlist)
.
像这样:
query ='UPDATE table SET isValid = false WHERE id = %s AND customerid = %s AND filed IN %s'
data = (id, customerid, tuple(fieldlist))
cursor.execute(query, data)