【问题标题】:Psycopg2 execute values -the query contains more than one '%s' placeholderPsycopg2 执行值 - 查询包含多个“%s”占位符
【发布时间】:2022-01-24 23:10:35
【问题描述】:

我正在尝试使用 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' 占位符” 或“并非所有值都在字符串格式化期间格式化”,“___ 中的语法错误”

我应该怎么写?

【问题讨论】:

    标签: python sql postgresql psycopg2


    【解决方案1】:

    你的陈述很好,但你应该在这里使用光标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 子句的插入。

    【讨论】:

    • 嗨,我知道,但我正在努力让它更快地工作。并认为 psycopg2 execute_values 是方式
    • 您只更新了一行,所以execute_valuesexecute_batch 并没有真正的帮助。按照@TimBiegeleisen 所示重新配置。
    • @AdrianKlaver 已更新,因为您不理解我的问题。我应该如何编写它来更新多行?
    • 我理解了最初提出的问题,您只是没有提出正确的问题。见Fast execution helpersexecute_batch
    【解决方案2】:

    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) 之后为值构造的“表”和“列”分配别名,然后在其他地方通过这些别名引用它们。

    【讨论】:

      猜你喜欢
      • 2018-02-11
      • 1970-01-01
      • 2018-10-07
      • 1970-01-01
      • 1970-01-01
      • 2018-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多