使用.NET Npgsql在PostgreSQL中取消嵌套和大容量插入

ruoxqz4g  于 2022-10-15  发布在  .NET
关注(0)|答案(1)|浏览(127)

我正在尝试使用单个命令进行大容量插入。它对int/字符串这样的简单值有效,但在插入到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),这将导致逐行插入(正如我所希望的)。现在,当我添加下一个@c jsonb参数时,它失败了,而不是逐行插入,我得到了一个错误42883: function pg_catalog.unnest(jsonb) does not exist,这是一个谎言,因为我只能在前面为id/字符串插入它。.NET中的第三个参数如下所示:
new NpgsqlParameter<string[]>(name, NpgsqlTypes.NpgsqlDbType.Jsonb) { Value = value.ToJson() }
ToJson方法做的是:
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])"它起作用了,但前两列插入没有问题,但第三列只插入了一行,其中包含所有结果,其余行为空。
有人能帮我看看我错过了什么吗?

t9aqgxwy

t9aqgxwy1#

问题是您没有传入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)

相关问题