PostgreSQL:从json向表中插入数据

PostgreSQL:从json向表中插入数据,json,postgresql,insert,Json,Postgresql,Insert,现在我使用手动将json解析为插入字符串,如下所示 insert into Table (field1, field2) values (val1, val2) 但从json插入数据的方式并不舒服! 我找到了函数json\u populate\u record并尝试使用它: create table test (id serial, name varchar(50)); insert into test select * from json_populate_record(NULL::test

现在我使用手动将json解析为插入字符串,如下所示

insert into Table (field1, field2) values (val1, val2)
但从json插入数据的方式并不舒服! 我找到了函数json\u populate\u record并尝试使用它:

create table test (id serial, name varchar(50));
insert into test select * from json_populate_record(NULL::test, '{"name": "John"}');
但失败的消息是:列“id”中的null值违反了notnull约束 PG知道id是序列号,但假装是个傻瓜。对于所有具有默认值的FIED也是如此


将json中的数据插入到表中是否有更优雅的方法?

对于
json\u populate\u record
来说,返回表示“生成此值”的标记并不容易

PostgreSQL不允许您插入
NULL
来指定应生成的值。如果你问
NULL
Pg的意思是
NULL
,不想再猜你。此外,生成一个没有
notnull
约束的列是完全可以的,在这种情况下,可以将
NULL
插入其中

如果要让PostgreSQL使用表默认值,有两种方法:

  • 插入
    列列表中省略该行;或
  • 显式写入
    默认值
    ,该值仅在
    表达式中有效
由于您不能在此处使用
值(默认值,…)
,因此您唯一的选择是从
插入
列列表中省略该列:

regress=# create table test (id serial primary key, name varchar(50));
CREATE TABLE
regress=# insert into test(name) select name from json_populate_record(NULL::test, '{"name": "John"}');
INSERT 0 1
是的,这意味着您必须列出列。实际上,有两次,一次在
选择
列表中,一次在
插入
列列表中

为了避免这种需要,PostgreSQL需要有一种方法将
DEFAULT
指定为记录的值,因此
json\u populate\u record
可以为未定义的列返回
DEFAULT
,而不是
NULL
。这可能不是您对所有列的预期,并且会导致在
INSERT
表达式中未使用
json\u populate\u record
时如何处理
DEFAULT
的问题

因此,我猜
json\u populate\u record
可能没有您希望的具有生成键的行有用。

继续,您可能需要编写某种存储过程来执行必要的动态SQL,如下所示:

创建或替换函数jsoninsert(relname text,reljson text)
将记录返回为
$BODY$DECLARE
ret记录;
输入字符串文本;
开始
在inputstring中选择string_agg(quote_ident(键),',')
从json_对象_键(reljson::json)作为X(键);
执行“插入”| | quote_ident(relname)
||“(“| |输入字符串| |”)选择“| |输入字符串”
||'从json_填充_记录(NULL::'| | quote_ident(relname)| |',json_in($1))返回*'
使用reljson::cstring进入ret;
返回ret;
结束;
$BODY$
语言plpgsql;
然后你会打电话给他

选择jsoninsert('test','{“name”:“John”}');

“我找到了函数
json\u populate\u record
”。嗯。哪里函数定义是什么?您是在运行PostgreSQL 9.3测试版,还是在其他地方安装的功能?它是9.3测试版的功能,非常酷。有没有一种方法可以基于json输入
更新
?@jney我真的不知道你在问什么。我建议发布一个新的适当详细的问题,并链接回这个问题以了解上下文。非常有用的信息(关于
json\u populate\u record
的文档有点稀疏)。但是,似乎确实有一个很好的例子来说明“如果没有指定值,则使用默认值”的效果。