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”和“列”分配别名,然后在别处通过这些别名引用它们。