Psycopg2 执行值 - 查询包含多个“%s”占位符
Psycopg2 execute values -the query contains more than one '%s' placeholder
我正在尝试使用 psycopg2 execute_values 来加快执行速度并不断出错,所以我想我没有写正确的 sql 语句。
这就是我的尝试:
sql = """UPDATE table SET value1 = %s, value2 = %s, value3 = %s WHERE id = %s"""
for feat in features:
value1=feat.value
value2=feat.value
value3=feat.value
parameters = [
value1,
value2,
value3,
]
all_parameters.append(parameters)
execute_values(cur,sql,all_parameters)
我也尝试使用 VALUES:
sql="""UPDATE table SET (value1,value2,value3) VALUES (%s) WHERE id=%s"""
这个给我的主要是 VALUES
的语法错误
我不断收到:“查询包含多个‘%s’占位符”
或“并非所有值都在字符串格式化期间格式化”,“___”中的语法错误
应该怎么写?
你的陈述很好,但你应该在这里使用游标 execute()
:
sql = """UPDATE table
SET value1 = %s, value2 = %s, value3 = %s, value4 = %s,
value5 = %s, value6 = %s, value7 = %s, value8 = %s, value9 = %s
WHERE id = %s"""
parameters = (value1, value2, value3, value4, value5, value6, value7, value8, value9, id,)
cur.execute(sql, parameters)
execute_values()
旨在用于带有 VALUES
子句的插入。
execute_values 只提供一个“项目”,所以只需要一个 %s。但该项目是双重复合(元组列表)。这种语法对于 INSERT 来说很自然,但对于 UPDATE 来说有点奇怪。所以你需要把语句写得有点奇怪。
sql = """UPDATE tableb SET value1 = v1, value2 = v2, value3 = v3
from (values %s) f(id, v1, v2, v3)
WHERE tableb.id = f.id"""
for feat in features:
parameters = [
feat.id,
feat.value1,
feat.value2,
feat.value3,
]
all_parameters.append(parameters)
execute_values(cur,sql,all_parameters)
请注意,您需要如何在 (values %s)
之后为值构造的“table”和“列”分配别名,然后在别处通过这些别名引用它们。
我正在尝试使用 psycopg2 execute_values 来加快执行速度并不断出错,所以我想我没有写正确的 sql 语句。
这就是我的尝试:
sql = """UPDATE table SET value1 = %s, value2 = %s, value3 = %s WHERE id = %s"""
for feat in features:
value1=feat.value
value2=feat.value
value3=feat.value
parameters = [
value1,
value2,
value3,
]
all_parameters.append(parameters)
execute_values(cur,sql,all_parameters)
我也尝试使用 VALUES:
sql="""UPDATE table SET (value1,value2,value3) VALUES (%s) WHERE id=%s"""
这个给我的主要是 VALUES
的语法错误我不断收到:“查询包含多个‘%s’占位符” 或“并非所有值都在字符串格式化期间格式化”,“___”中的语法错误
应该怎么写?
你的陈述很好,但你应该在这里使用游标 execute()
:
sql = """UPDATE table
SET value1 = %s, value2 = %s, value3 = %s, value4 = %s,
value5 = %s, value6 = %s, value7 = %s, value8 = %s, value9 = %s
WHERE id = %s"""
parameters = (value1, value2, value3, value4, value5, value6, value7, value8, value9, id,)
cur.execute(sql, parameters)
execute_values()
旨在用于带有 VALUES
子句的插入。
execute_values 只提供一个“项目”,所以只需要一个 %s。但该项目是双重复合(元组列表)。这种语法对于 INSERT 来说很自然,但对于 UPDATE 来说有点奇怪。所以你需要把语句写得有点奇怪。
sql = """UPDATE tableb SET value1 = v1, value2 = v2, value3 = v3
from (values %s) f(id, v1, v2, v3)
WHERE tableb.id = f.id"""
for feat in features:
parameters = [
feat.id,
feat.value1,
feat.value2,
feat.value3,
]
all_parameters.append(parameters)
execute_values(cur,sql,all_parameters)
请注意,您需要如何在 (values %s)
之后为值构造的“table”和“列”分配别名,然后在别处通过这些别名引用它们。