Go言語で複数のデータをまとめてDBにINSERTする(バルクインサート)方法をメモ書きします。
test_table
のid
とname
カラムに次の四件のレコードを追加するものとします。
[][]string{{"1", "Sato"}, {"2", "Suzuki"}, {"3", "Tanaka"}, {"4", "Saito"}}
func Insert(db *sqlx.DB) error {
// INSERTを行うデータのリスト(id, name)
list := [][]string{{"1", "Sato"}, {"2", "Suzuki"}, {"3", "Tanaka"}, {"4", "Saito"}}
// SQL文の生成
sql := "INSERT INTO test_table (id, name) VALUES "
// VALUES部分の生成
for _, row := range list {
sql += fmt.Sprintf("('%v', '%v'),", row[0], row[1])
}
sql = sql[:len(sql)-1]
// 必要があればコンテキストを生成する
// ctx := app.NewContext(context.Background(), txn)
// SQLの解析
st, err := db.Prepare(sql)
// コンテキストを使う場合は下記に書き換える
// st, err := tx.PreparexContext(ctx, sql)
if err != nil {
return fmt.Errorf("Prepareで失敗しました:%v", err)
}
defer func() {
if err := st.Close(); err != nil {
log.Printf("Prepareのクローズで失敗しました: %v", err)
}
}()
// SQLの実行()
res, err := st.Exec()
// コンテキストを使う場合は下記に書き換える
// res, err := st.ExecContext(ctx)
if err != nil {
return fmt.Errorf("SQLの実行に失敗しました:%v", err)
}
return nil
}