python - 如何使用 psycopg2 更新 postgresql 中多行的多列

标签 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: table "data"has 2 columns available but 3 columns specified 我经历了多次这个网站上的解决方案,但似乎没有一个适合我。

有解决办法吗?

最佳答案

您的数据已经是psycopg2.extras.execute_values期望的格式。

所以,不要将它转换成另一个元组,简单地做

execute_values(cursor, query, data)

关于python - 如何使用 psycopg2 更新 postgresql 中多行的多列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56749043/

相关文章:

python - Geopy异常处理

python - django bytesIO 到 base64 字符串并作为 JSON 返回

python - R 的 `pairs` 的 matplotlib 模拟

postgresql - 使用 postgres 进行 Sequelize - 查找 uuid 数组中包含 uuid 的所有位置

sql - postgresql:tableA 或 tableB 的外键

python - Psycopg2 错误信息

python - psycopg : Python. h:没有这样的文件或目录

python - 没有在 postgresql 中的表上执行查询

python - 将特定的选定列提取到新的 DataFrame 作为副本

postgresql - 如何从Postgres 9.4转储大对象数据,然后导入到Postgres8.x?