Python psycopg2执行_值与冲突DO更新

Python psycopg2执行_值与冲突DO更新,python,postgresql,psycopg2,Python,Postgresql,Psycopg2,我从一个API中检索数据,该API包含每个记录的唯一键和JSON对象。数据以5000个结果为一批返回。我想将execute_values()与ON CONFLICT('id')DO UPDATESQL语句结合使用,一次插入/更新所有响应。我不确定我在下面的最初尝试是否达到了我预期的效果,因为它似乎只是在发生冲突时跳过。我不想单独插入/更新每条记录,因为那样会减慢速度 我的目标是在表中不存在id时插入新记录。如果id确实存在,那么我想更新记录 import os import logging im

我从一个API中检索数据,该API包含每个记录的唯一键和JSON对象。数据以5000个结果为一批返回。我想将
execute_values()
ON CONFLICT('id')DO UPDATE
SQL语句结合使用,一次插入/更新所有响应。我不确定我在下面的最初尝试是否达到了我预期的效果,因为它似乎只是在发生冲突时跳过。我不想单独插入/更新每条记录,因为那样会减慢速度

我的目标是在表中不存在
id
时插入新记录。如果
id
确实存在,那么我想更新记录

import os
import logging
import json
import psycopg2
from psycopg2.extras import execute_values

conn = psycopg2.connect(
    host=os.getenv("psql_host"),
    database=os.getenv("psql_db"),
    user=os.getenv("psql_user"),
    password=os.getenv("PGPASSWORD"),
)
conn.autocommit = True
cur = conn.cursor()

url = "https://api.website.com/v1/export"
while url is not None:
    r = requests.get(url)
    if r.status_code == 200:
        logging.info(f"Request successful: {url}")
        data = r.json()
        logging.info(f"{len(data['data'])} responses retrieved")
        values = [(line["id"], json.dumps(line["attributes"])) for line in data["data"]]
        try:
            execute_values(
                cur,
                """
                INSERT INTO my_table.responses (id, data)
                VALUES %s
                ON CONFLICT ('id') DO UPDATE SET
                (data) = ROW(EXCLUDED.data);
                """,
                values,
            )
        except Exception:
            logging.info("Unable to insert values")
        url = data["links"]["next"]
    else:
        logging.warning(f"Request failed {r.status_code}: {url}")
        pass

快速查看说明:
(data)=行(EXCLUDED.data)
可能应该是:
data=EXCLUDED.data