繁体   English   中英

Npgsql C# 多行/值插入

[英]Npgsql C# multi row/value insert

我一直在查看 PostGres 多行/值插入,它在纯 SQL 中看起来像这样:

insert into table (col1, col2, col3) values (1,2,3), (4,5,6)....

我想使用它的原因是我有很多数据要插入,这些数据是通过队列到达的,我一次批量插入 500/1000 条记录以提高性能。

但是,我一直无法在 C# 中找到执行此操作的示例,我能找到的一切都是一次只添加一个记录参数,然后执行,这太慢了。

我目前使用 Dapper 进行这项工作,但我需要将 SQL 扩展为 upsert(在冲突更新时插入),我发现的所有内容都表明 Dapper 无法处理。 我找到了 Postgres 可以在单个操作中处理 upsert 和多值的证据。

汤姆

我没有完全正确理解你的问题。 但是对于 Postgresql 中的批量插入,这是一个很好的答案

它给出了将列表 (RecordList) 中的多条记录插入表 (user_data.part_list) 的示例:

using (var writer = conn.BeginBinaryImport(
"copy user_data.part_list from STDIN (FORMAT BINARY)"))
{
    foreach (var record in RecordList)
    {
        writer.StartRow();
        writer.Write(record.UserId);
        writer.Write(record.Age, NpgsqlTypes.NpgsqlDbType.Integer);
        writer.Write(record.HireDate, NpgsqlTypes.NpgsqlDbType.Date);
    }

    writer.Complete();
}

COPY是最快的方法,但如果您想使用ON CONFLICT ...子句执行 UPSERTS,则它不起作用。

如果有必要使用INSERT ,可以使用UNNEST优雅地完成摄取n行(每次调用可能有不同的n

INSERT INTO table (col1, col2, ..., coln) SELECT UNNEST(@p1), UNNEST(@p2), ... UNNEST(@pn);

然后参数p需要是匹配类型的数组。 下面是一个整数数组的例子:

new NpgsqlParameter()
{
 ParameterName = "p1",
 Value = new int[]{1,2,3},
 NpgsqlDbType = NpgsqlDbType.Array | NpgsqlDbType.Integer
}

如果您想有效地插入许多记录,您可能需要查看Npgsql 的批量复制 API ,它不使用 SQL 并且是最有效的选项。

否则,插入两行而不是一行没有什么特别之处:

insert into table (col1, col2, col3) values (@p1_1,@p1_2,@p1_3), (@p2_1,@p2_2,@p_3)....

只需添加具有正确名称的参数,并像执行任何其他 SQL 一样执行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM