首页 > 解决方案 > 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,
            )

标签: pythonpostgresqlpsycopg2

解决方案


推荐阅读