Skip to content

Instantly share code, notes, and snippets.

@TrinhTrungDung
Created March 20, 2020 14:38
Show Gist options
  • Save TrinhTrungDung/15af055ed5ac4a61da0f926a090d9d23 to your computer and use it in GitHub Desktop.
Save TrinhTrungDung/15af055ed5ac4a61da0f926a090d9d23 to your computer and use it in GitHub Desktop.
Test bulk create using INSERT statement with batching
func BenchmarkBulkCreate(b *testing.B) {
db, err := gorm.Open("postgres", "host=localhost port=5432 user=testuser dbname=testdb password=123456 sslmode=disable")
if err != nil {
fmt.Println(err)
}
defer db.Close()
users := stubUsers(b)
size := 500
tx := db.Begin()
chunkList := funk.Chunk(users, size)
for _, chunk := range chunkList.([][]*User) {
valueStrings := []string{}
valueArgs := []interface{}{}
for _, user := range chunk {
valueStrings = append(valueStrings, "(?, ?)")
valueArgs = append(valueArgs, user.Name)
valueArgs = append(valueArgs, user.Password)
}
stmt := fmt.Sprintf("INSERT INTO users (name, password) VALUES %s", strings.Join(valueStrings, ","))
err = tx.Exec(stmt, valueArgs...).Error
if err != nil {
tx.Rollback()
fmt.Println(err)
}
}
err = tx.Commit().Error
if err != nil {
fmt.Println(err)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment