为 Postgres JSON 文档生成 UUID
Generate UUID for Postgres JSON document
我正在插入带有 JSON 文档的 Postgres table,我想为该文档生成一个唯一 ID。我自己当然可以,但是我想知道有没有办法让PG来做。
INSERT INTO test3 (data) VALUES ('{"key": "value", "unique": ????}')
文档似乎表明 JSON 记录适合各种 SQL 数据类型,但我不明白它是如何工作的。
只是串联怎么样?假设您的专栏是 json/jsonb 类型,类似下面的内容应该有效:
INSERT INTO test3 (data) VALUES (('{"key": "value", "unique": "' || uuid_generate_v4() || '"}')::jsonb)
如果您希望生成 UUID 并将其与 JSON 数据字段中的值同时存储,有些人可能会发现以下内容更明智:
WITH
-- Create a temporary view named "new_entry" containing your data
new_entry
-- This is how you name the view's columns
("key", "unique")
AS (
VALUES
-- This is the actual row returned by the view
(
'value',
uuid_generate_v4()
)
)
INSERT INTO
test3(
data
)
SELECT
-- Convert row to JSON. Column name = key, column value = value.
ROW_TO_JSON(new_entry.*)
FROM
new_entry
首先,我们要创建一个名为 new_entry
的临时视图,其中包含要存储在 JSON
数据字段中的所有数据。
其次,我们获取该条目并将其传递给 ROW_TO_JSON
函数,该函数将其转换为有效的 JSON 数据类型。转换后,它会将行插入 test3
table.
我对“理智”的推理是,您的 JSON
对象很可能最终包含的不仅仅是两个 key/value 对...相反,您最终会得到一堆键和值,由你来确保你不会错过任何引号并适当地转义用户输入。当您可以让 Postgres 为您完成这些工作(在 ROW_TO_JSON()
的帮助下)同时又使其更易于阅读和调试时,为什么还要手动将所有这些粘合在一起?
我正在插入带有 JSON 文档的 Postgres table,我想为该文档生成一个唯一 ID。我自己当然可以,但是我想知道有没有办法让PG来做。
INSERT INTO test3 (data) VALUES ('{"key": "value", "unique": ????}')
文档似乎表明 JSON 记录适合各种 SQL 数据类型,但我不明白它是如何工作的。
只是串联怎么样?假设您的专栏是 json/jsonb 类型,类似下面的内容应该有效:
INSERT INTO test3 (data) VALUES (('{"key": "value", "unique": "' || uuid_generate_v4() || '"}')::jsonb)
如果您希望生成 UUID 并将其与 JSON 数据字段中的值同时存储,有些人可能会发现以下内容更明智:
WITH
-- Create a temporary view named "new_entry" containing your data
new_entry
-- This is how you name the view's columns
("key", "unique")
AS (
VALUES
-- This is the actual row returned by the view
(
'value',
uuid_generate_v4()
)
)
INSERT INTO
test3(
data
)
SELECT
-- Convert row to JSON. Column name = key, column value = value.
ROW_TO_JSON(new_entry.*)
FROM
new_entry
首先,我们要创建一个名为 new_entry
的临时视图,其中包含要存储在 JSON
数据字段中的所有数据。
其次,我们获取该条目并将其传递给 ROW_TO_JSON
函数,该函数将其转换为有效的 JSON 数据类型。转换后,它会将行插入 test3
table.
我对“理智”的推理是,您的 JSON
对象很可能最终包含的不仅仅是两个 key/value 对...相反,您最终会得到一堆键和值,由你来确保你不会错过任何引号并适当地转义用户输入。当您可以让 Postgres 为您完成这些工作(在 ROW_TO_JSON()
的帮助下)同时又使其更易于阅读和调试时,为什么还要手动将所有这些粘合在一起?