sql - 如何使用包 database/sql 批处理 sql 语句

标签 sql go

如何使用 Go 的 database/sql 包批处理 sql 语句?

在 Java 中我会这样做:

// Create a prepared statement
String sql = "INSERT INTO my_table VALUES(?)";
PreparedStatement pstmt = connection.prepareStatement(sql);

// Insert 10 rows of data
for (int i=0; i<10; i++) {
    pstmt.setString(1, ""+i);
    pstmt.addBatch();
}

// Execute the batch
int [] updateCounts = pstmt.executeBatch();

我如何在 Go 中实现同样的目标?

最佳答案

因为 db.Exec 函数是 variadic ,一种选择(实际上只进行一次网络往返)是自己构造语句并分解参数并将它们传递进来。

示例代码:

func BulkInsert(unsavedRows []*ExampleRowStruct) error {
    valueStrings := make([]string, 0, len(unsavedRows))
    valueArgs := make([]interface{}, 0, len(unsavedRows) * 3)
    for _, post := range unsavedRows {
        valueStrings = append(valueStrings, "(?, ?, ?)")
        valueArgs = append(valueArgs, post.Column1)
        valueArgs = append(valueArgs, post.Column2)
        valueArgs = append(valueArgs, post.Column3)
    }
    stmt := fmt.Sprintf("INSERT INTO my_sample_table (column1, column2, column3) VALUES %s", 
                        strings.Join(valueStrings, ","))
    _, err := db.Exec(stmt, valueArgs...)
    return err
}

在我运行的一个简单测试中,该解决方案在插入 10,000 行时比另一个答案中提出的 Begin、Prepare、Commit 快了大约 4 倍 - 尽管实际改进很大程度上取决于您的个人设置、网络延迟、等等

关于sql - 如何使用包 database/sql 批处理 sql 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12486436/

相关文章:

sql - SET NOCOUNT ON 使用情况

sql - 为什么两个 mysql 文件(相同的表,相同的内容)大小不同?

go - 标准 Go 库中的 Float64 Less() 实现

go - 是否有一种快捷方式可以将变量分配给指针而无需先在单独的行中创建变量?

php - golang 相当于 PHP crypt()

sql - 如何从日期期间获取特定的工作日?

sql - 下面的代码有什么问题?

go - 如何获取进程所有者使用 WMI 请求

json - 如何在 Go 中使用非必需的 JSON 参数?

sql - T-sql 查询以 CSV 格式输出值