簡體   English   中英

用json數據同步postgres表

[英]sync postgres table with json data

我有一個端點以json格式獲取信息

[
  {
    id: 123,
    name: 'a name',
    code: '123SDF',
    category: 'some category'
  },
  {
    id: 234,
    name: 'a another name',
    code: '234SDF',
    category: 'some category'
  },
  etc...
]

我需要將其與我擁有的本地表同步。 我只是截斷並添加,但現在我需要更新或插入。 原因是因為我正在向本地表添加列。 本地表具有以下列:

id,
name,
code,
category,
template

因此,我將不再截斷,因為我將丟失模板字段。 我可以運行什么查詢,以便在找到ID時更新該查詢,否則為其他字段插入null?

JSON數據和我的表的ID都相同。

我想有多種方法可以做到這一點。 您可以將表配置為使id列唯一,然后在該行已存在時使用ON CONFLICT子句進行更新。

但是,這是一種無需更改表內容即可實現的方法。

  1. 轉換數據(只是使事情變得簡單)
  2. 進行更新,找出更新了哪些ID
  3. 對未更新的ID進行INSERT

設定:

CREATE TABLE t (id INTEGER, name TEXT, code TEXT, category TEXT, template TEXT);

INSERT INTO t VALUES (123, 'a name', 'a code', 'a cat', 'a template');

可憐的人的粗話:

WITH
  source_data AS (
    SELECT (j->>'id')::INTEGER AS id,
           j->>'name' AS name,
           j->>'code' AS code,
           j->>'category' AS category
    FROM JSON_ARRAY_ELEMENTS(
      '[
        {
        "id": 123,
        "name": "a name",
        "code": "123SDF",
        "category": "some category"
        },
        {
        "id": 234,
        "name": "a another name",
        "code": "234SDF",
        "category": "some category"
        }
      ]'::JSON) j
  ),
  updated AS (
    UPDATE t
    SET name = s.name,
        code = s.code,
        category = s.category
    FROM source_data s
    WHERE t.id = s.id
    RETURNING t.id
  )
INSERT INTO t
SELECT id, name, code, category, NULL
FROM source_data s
WHERE s.id NOT IN (SELECT id FROM updated);

在upsert之后執行SELECT * FROM t結果:

| id  | name           | code   | category      | template   |
| --- | -------------- | ------ | ------------- | ---------- |
| 123 | a name         | 123SDF | some category | a template |
| 234 | a another name | 234SDF | some category |            |

您可以看到現有記錄的模板值未被覆蓋。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM