代码之家  ›  专栏  ›  技术社区  ›  user3810626

为Postgres JSON文档生成UUID

  •  1
  • user3810626  · 技术社区  · 7 年前

    我正在将一个JSON文档插入到Postgres表中,我想为该文档生成一个唯一的ID。当然,我可以自己做,但我想知道是否有办法让PG来做。

    INSERT INTO test3 (data) VALUES ('{"key": "value", "unique": ????}')
    

    这些文档似乎表明JSON记录适合各种SQL数据类型,但我不知道这实际上是如何工作的。

    2 回复  |  直到 7 年前
        1
  •  4
  •   Shay Rojansky    7 年前

    只是串联一下怎么样?假设您的列是json/jsonb类型,下面的内容应该可以使用:

    INSERT INTO test3 (data) VALUES (('{"key": "value", "unique": "' || uuid_generate_v4() || '"}')::jsonb)
    
        2
  •  1
  •   Joshua Burns    3 年前

    如果您希望生成一个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 桌子

    我对“理智”的推理是 JSON 对象将只包含两个以上的键/值对。。。相反,您最终会得到一手满是键和值的数据,在这些数据中,您需要确保不会遗漏任何引号,并适当地转义用户输入。当你可以让Postgres为你做这件事时,为什么要手动将所有这些粘合在一起(在 ROW_TO_JSON() )同时,使其更易于阅读和调试?