我如何使用psycopg2更新PostgreSQL中多行上的多列

时间:2019-06-25 07:37:42

标签: python postgresql psycopg2

我有一个稍微复杂的sql查询,该查询应更新表中多行上的多列。我正在尝试将多个参数传递给查询,并通过psycopg2循环更新要更新的数据,但我找不到解决方法。

这是我想循环浏览的示例数据。

 data = [(214, 'Feb', 545), (215, 'March', 466)]

到目前为止,这里是我拥有的SQL查询

    query = """
      UPDATE table_1
      SET 
      date_from = 
       (CASE version 
           WHEN 1 THEN '1900-01-01' ELSE 
       ( SELECT date_to 
             FROM table_1 
             WHERE month = data.month
             AND cust_key = data.cust_key 
             AND prod_key = data.prod_key
         AND version = (
               SELECT version-1 
               FROM table_1 
               WHERE month = data.month 
               AND cust_key = data.cust_key 
               AND prod_key = data.prod_key
           ORDER BY version DESC LIMIT 1)
        ) 
    END), 
      date_to = current_date
      FROM (VALUES %s) AS data(cust_key, month, prod_key)
      WHERE month = data.month
      AND cust_key = data.cust_key 
      AND prod_key = data.prod_key
     """

这是我传递参数的方式

    WHERE month = data.month
    AND cust_key = data.cust_key 
    AND prod_key = data.prod_key
    FROM (VALUES %s) AS data(cust_key, month, prod_key)

这就是我执行查询的方式

    cursor = db.cursor()
    execute_values(cursor, query, (data,))
    db.commit()
    return True

执行查询时,出现此错误 psycopg2.errors.InvalidColumnReference:表“数据”有2列可用,但指定了3列 该网站上的解决方案,但似乎没有一个适合我。

有没有办法解决这个问题?

1 个答案:

答案 0 :(得分:1)

您的data已经采用psycopg2.extras.execute_values期望的格式。

因此,请勿将其转换为另一个元组,只需执行

execute_values(cursor, query, data)