Python psycopg2执行_值与冲突DO更新
我从一个API中检索数据,该API包含每个记录的唯一键和JSON对象。数据以5000个结果为一批返回。我想将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
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
。