python - PostgreSQL - 插入,在冲突和 SHA256 不匹配时,更新记录,否则跳过
问题描述
我正在连接一个 API,该 API 提供对一些可能随时间缓慢变化的数据的访问。我想将此数据写入 Postgres 表中的 JSON 列。如果我遇到一个id
我已经收集的,我想将新的 SHA256 与现有的 SHA256 进行比较,如果它们不匹配,那么我想id
用新的 SHA256 更新数据库中的现有记录和新数据。
我能够弄清楚这ON CONFLICT ('id') DO UPDATE
部分,但我不确定如何扩展此部分以反映识别 SHA256 何时不匹配的逻辑,然后进行更新。理想情况下,如果数据(因此 SHA256)以某种方式发生变化,我只会更新我已经收集的记录。否则,我想跳过该记录,因为没有任何改变。
import os
import json
import requests
import hashlib
import psycopg2
from psycopg2.extras import execute_values
r = s.get("https://www.api.com")
if r.status_code != 200:
break
else:
data = r.json()
if len(data["data"]) == 0:
break
else:
values = []
for line in data["data"]:
d = json.dumps(line["attributes"], encoding='utf-8', sort_keys=True)
sha256 = hashlib.sha256(d).hexdigest()
row = (line["id"], sha256, d)
values.append(row)
try:
execute_values(
cur,
"""
INSERT INTO schema.tablename (id, sha256, data)
VALUES %s
ON CONFLICT ('id') DO UPDATE SET
data = EXCLUDED.data
""",
values,
)
解决方案
推荐阅读
- c++ - 损坏的结构字符数组 - sqlite C++
- android - 从 MediaBrowserService 获取正在播放的项目
- awk - 从文件中grep ip和端口
- kubernetes - 如何使用 Istio 创建内部网关?
- javascript - php中可扩展的列表
- python - 命令“xx”返回一个非零代码:1
- google-apps-script - 找不到总体加权标记或作业类别的资源
- c# - 在没有拆分、不同和 foreach 的情况下查找字符串中最长的单词(并将其写出来)
- javascript - 需要帮助将缓冲区转换为节点中的字符串
- apache-spark - Windows 10 上的 pyspark 安装失败