【问题标题】:Bulk insert C# dataset to AWS PostgreSql将 C# 数据集批量插入 AWS PostgreSql
【发布时间】:2021-05-20 19:41:18
【问题描述】:

我想像 sqlbulkcopy 一样单次将 .net 中的数据表批量插入 AWS postgres 表。 我尝试了复制命令,但它需要一些 pgadmin_reader 访问权限。请指导我如何解决这个问题。

【问题讨论】:

  • 你在使用 Npgsql 吗?如果是这样,它有一个极好的副本。从 STDIN 复制不需要超级用户。 npgsql.org/doc/copy.html
  • @Hambone:感谢您的回复。是的,我正在使用 Npgsql。当您说 STDIN 时,这是什么意思。我发现的大多数示例都是关于 CSV 的。我的数据是数据表格式。

标签: c# .net postgresql amazon-web-services amazon-ec2


【解决方案1】:

跟进我的评论和您的后续问题,如果您从文件中复制 Npgsql,那么您需要超级用户权限。这是因为该文件将驻留在 PostgreSQL 服务器上,人们会认为很少有用户(希望只有管理员)可以访问甚至知道。

但是,如果您从 STDIN(标准输入)复制,那么这本质上就是您将提供的数据流。

关于如何从 STDIN 复制的非常简短的入门/示例如下:

using (NpgsqlConnection conn = new NpgsqlConnection(connectionString))
{
    conn.Open();

    using (var writer = conn.BeginBinaryImport("copy my_table from STDIN (FORMAT BINARY)"))
    {
        foreach (object[] fields in myData)
        {
            writer.StartRow();
            writer.Write(fields[0]); // Assumes varchar
            writer.Write(fields[1], NpgsqlTypes.NpgsqlDbType.Integer);
            writer.Write(fields[2], NpgsqlTypes.NpgsqlDbType.Date);
        }

        writer.Complete();
    }
}

Npgsql 帮助网站上的更多内容。

【讨论】:

    【解决方案2】:

    尝试使用 PgPartner 等库来轻松完成批量添加。查看 PgPartner:https://www.nuget.org/packages/PgPartner/

    https://github.com/SourceKor/PgPartner#bulkadd-npgsqlconnection-extension

    用法:

    // Domain Model Objects
    var samples = new List<Sample>()
    {
        new Sample { Id = Guid.NewGuid(), Name = "Test", ItemSum = 200, ItemAmount = 10 },
        new Sample { Id = Guid.NewGuid(), Name = "Test 2", ItemSum = 400, ItemAmount = 20 },
        new Sample { Id = Guid.NewGuid(), Name = "Test 3", ItemSum = 800, ItemAmount = 30 },
        new Sample { Id = Guid.NewGuid(), Name = "Test 4", ItemSum = 1200, ItemAmount = 40 },
        new Sample { Id = Guid.NewGuid(), Name = "Test 5", ItemSum = 2400, ItemAmount = 50 }
    };
    
    // Instantiate and open PostgreSQL database connection
    using var conn = new NpgsqlConnection("<connection string>");
    conn.Open();
    
    // Execute BulkAdd by passing objects to insert into table, single object mapping, database schema, and database table
    conn.BulkAdd(
        samples,
        (mapper, sample) => {
            mapper.Map("id", sample.Id, NpgsqlDbType.Uuid);
            mapper.Map("name", sample.Name, NpgsqlDbType.Text);
            mapper.Map("amount", sample.ItemAmount, NpgsqlDbType.Numeric);
            mapper.Map("sum", sample.ItemSum, NpgsqlDbType.Integer);
        },
        "public",
        "\"Samples\""
    );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-22
      • 2019-03-15
      • 2013-02-06
      相关资源
      最近更新 更多