在PostgreSQL中使用Unest和大容量插入.NET Npgsql



我正在尝试用单个命令进行大容量插入。它适用于像int/string这样的简单值,但在插入到jsonb列时失败了。

我的表格示例:

CREATE TABLE data_table2 (id INTEGER NOT NULL, name TEXT NOT NULL, test jsonb, bar jsonb)

我的查询来自。NET(在没有@c参数的情况下使用时效果非常好(:

"INSERT INTO data_table2 (id, name, test, bar) SELECT * FROM unnest(@a, @b, @c, @d)"

我正在创建这样的@a参数:new NpgsqlParameter<int[]>(name, value),它导致逐行插入(就像我想要的那样(。现在,当我添加下一个@cjsonb参数时,它失败了,并且我没有逐行插入,而是得到了一个错误42883: function pg_catalog.unnest(jsonb) does not exist,这是一个谎言,因为我以前只能插入id/string。net中的第三个参数如下:

new NpgsqlParameter<string[]>(name, NpgsqlTypes.NpgsqlDbType.Jsonb) { Value = value.ToJson() }

而CCD_ 10方法正在做:

value.Select(x => Newtonsoft.Json.JsonConvert.SerializeObject(x, Newtonsoft.Json.Formatting.None, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore })).ToArray()

我已尝试将查询更改为:

"INSERT INTO data_table2 (id, name, test) SELECT * FROM unnest(@a, @b, ARRAY[@c])"它起作用了,但前两列被插入时没有问题,但第三列只插入了一行,其中包含了所有结果,其余行都为空。

有人能看看我缺了什么吗?

问题是您没有传入JSONB文档的数组,您必须将参数更改为

new NpgsqlParameter<string[]>(name, NpgsqlDbType.Jsonb | NpgsqlDbType.Array) { Value = value.ToJson() }`
//                                  ^^^ this is `jsonb[]` type

如果它仍然导致相同的错误,请确保ToJson实际返回数组。


另一个选项是将JSON作为字符串数组发送,并在INSERT语句中进行转换:

INSERT INTO data_table2 (id, name, test, bar) SELECT a, b, c::jsonb, d::jsonb FROM unnest(@a, @b, @c, @d) foo(a, b, c, d)

最新更新