この記事が解決する問題
gorpを利用している環境で、どうしてもバルクインサートしたいケース
ORMとしての利点を享受できないため、その部分許容できる場合にこの記事を参考いただければと思います。
gorpについては書いていないので下記を参照ください。
https://github.com/go-gorp/gorp
コード
// ユーザ情報をバルクインサートする例
func bulkInsertUsers(tx *gorp.Transaction, users []User) error {
sql := `INSERT INTO users(name, age, email) VALUES`
args := map[string]interface{}{}
for i, user := range users {
nameKey := fmt.Sprintf("name_%d", i)
ageKey := fmt.Sprintf("age_%d", i)
emailKey := fmt.Sprintf("email_%d", i)
args[nameKey] = user.Name
args[ageKey] = user.Age
args[emailKey] = plan.Email
// プリペアドステートメントを利用
sql += fmt.Sprintf("(:%s, :%s, :%s)," nameKey, ageKey, emailKey)
}
// 末尾の,を除去
sql = sql[0 : len(sql)-1]
_, err := tx.Exec(sql, args)
return err
}
データ量によりますが、ある程度の件数のデータをインサートする場合、普通にインサートするより数倍〜数十倍高速です。
まとめ
- gorp利用環境下でもバルクインサート自体はできる
- ORM必要ないならgorp使わなくていい