q := "INSERT INTO role(type,value) VALUES (:type, :value)"
pp := []map[string]interface{}{
{"type": "type1", "value": "val1"},
{"type": "type2", "value": "val2"},
{"type": "type3", "value": "val3"},
}
res, err := db.NamedExec(q, pp)
:type
, :value
が大事
スライス入れるだけでバルクインサートになるらしい
var users = []User{{Name: "jinzhu1"}, {Name: "jinzhu2"}, {Name: "jinzhu3"}}
db.Create(&users)
https://qiita.com/touyu/items/4b25fbf12804f12778b7
バルクインサートがサポートされてない場合はどうしようもないのでSprintfで頑張る
- kyleconroy/sqlc
- go-xorm/xorm
- go-gorp/gorp
※自力で実装する場合バインドできる引数の上限値を気にする
- 例1)PostgreSQL・MySQLは65535らしい
- 例2)SQLite3は外から指定できるっぽい: mattn/go-sqlite3#704
- xo/xo
ソース:https://zenn.dev/ryoneko/articles/4c1267d7d0e0ca (xo/xoまで調査)
- ISUCON9からは予選・本選ともにずっとsqlxが使われている
- ISUCON8以前は直叩きしてるっぽい?