[英]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
子句進行更新。
但是,這是一種無需更改表內容即可實現的方法。
設定:
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.