DRV*_*DRV 9 postgresql json sql-insert
我是初学者,尝试使用教程将 JSON 值插入数据库
我使用以下命令创建了该表
CREATE TABLE table_name( id character varying(50),
                         data json NOT NULL,
                         active boolean NOT NULL,
                         created_at timestamp with time zone NOT NULL,
                         updated_at timestamp with time zone NOT NULL,
                         CONSTRAINT table_name_pkey PRIMARY KEY (id)
                       );
Run Code Online (Sandbox Code Playgroud)
该表是使用 table_name 创建的。
现在我尝试将值插入数据库:
INSERT INTO table_name
SELECT id,data,active,created_at,updated_at
FROM json_populate_record (NULL::table_name,
     '{
        "id": "1",
        "data":{
                "key":"value"
                },
         "active":true,
         "created_at": SELECT NOW(),
         "updated_at": SELECT NOW()
       }'
  );
Run Code Online (Sandbox Code Playgroud)
它抛出以下错误
错误:类型 JSON '{ 的输入语法无效
任何人都可以帮助我解析 JSON 值并将其插入数据库吗?
小智 18
您不能在 JSON 字符串中包含任意 SQL 命令。从 JSON“角度”来看,SELECT NOW()这是一个无效值,因为它缺少双引号。但即使您使用"select now()"它,也会作为 SQL 查询执行并替换为当前时间戳)。
但我不明白你为什么要把它包装成jsonb_populate_record. 更好的解决方案(至少在我看来)是:
INSERT INTO table_name (id, data, active, created_at, updated_dat)
VALUES ('1', '{"key": "value"}', true, now(), now());
Run Code Online (Sandbox Code Playgroud)
如果你真的想让事情变得复杂,你需要使用字符串连接:
SELECT id,data,active,created_at,updated_at
FROM json_populate_record (NULL::table_name,
     format('{
        "id": "1",
        "data":{
                "key":"value"
                },
         "active":true,
         "created_at": "%s", 
         "updated_at": "%s"
       }', now(), now())::json
  );
Run Code Online (Sandbox Code Playgroud)
        |   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           50328 次  |  
        
|   最近记录:  |