0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

gorp利用環境下でバルクインサートしてみた

Last updated at Posted at 2020-09-02

この記事が解決する問題

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使わなくていい
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?