当我尝试使用 psycopg2 在 python 中执行多个更新时,ARRAY 附近出现语法错误

问题描述 投票:0回答:2

当我尝试使用 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
变量中,但我找不到解决问题的聪明方法。 谢谢

python postgresql psycopg2
2个回答
0
投票

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) ...


-1
投票

由于您的

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)

有关详细信息,请参阅文档

© www.soinside.com 2019 - 2024. All rights reserved.