Skip to content

Instantly share code, notes, and snippets.

@iktakahiro
Created December 15, 2015 11:54
Show Gist options
  • Save iktakahiro/9e630967360d3f439da5 to your computer and use it in GitHub Desktop.
Save iktakahiro/9e630967360d3f439da5 to your computer and use it in GitHub Desktop.
Go 言語 dbr で BULK INSERT ref: http://qiita.com/iktakahiro/items/490999bc34704fd71d36
type Member struct {
Number int64 `db:"number"`
Name string `db:"name"`
}
members := []Member{}
members = append(members, Member{10, "Lionel"})
members = append(members, Member{9, "Luis"})
fmt.Println(members) // [{101 Lionel true} {102 Luis false}]
// ここでは カラムの指定まで Query を組み立てます
stmt := sess.InsertInto("member").
Columns("number", "name")
// スライスの分だけ Record() を実行します
for _, value := range members {
stmt.Record(value)
}
buf := dbr.NewBuffer()
stmt.Build(dialect.MySQL, buf)
fmt.Println(buf.String()) // INSERT INTO `member` (`number`,`name`) VALUES (?,?), (?,?)
fmt.Println(buf.Value()) // [10 Lionel 9 Luis]
result, err := stmt.Exec()
if err != nil {
fmt.Println(err)
} else {
count, _ := result.RowsAffected()
fmt.Println(count) // 2
}
package main
import (
"fmt"
_ "github.com/go-sql-driver/mysql"
"github.com/gocraft/dbr"
"github.com/gocraft/dbr/dialect"
)
const (
// Database
USER string = "root"
PASSWORD string = "mysql01"
DB string = "dev"
HOST string = "172.16.1.168"
PORT string = "3306"
)
func main() {
type Member struct {
Number int64 `db:"number"`
Name string `db:"name"`
}
members := []Member{}
members = append(members, Member{10, "Lionel"})
members = append(members, Member{9, "Luis"})
fmt.Println(members) // [{101 Lionel true} {102 Luis false}]
// ここまではただの準備
conn, _ := dbr.Open("mysql", USER+":"+PASSWORD+"@tcp("+HOST+":"+PORT+")/"+DB, nil)
sess := conn.NewSession(nil)
// ここでは カラムの指定まで Query を組み立てます
stmt := sess.InsertInto("member").
Columns("number", "name")
// スライスの分だけ Record() を実行します
for _, value := range members {
stmt.Record(value)
}
// 組み立てた Query を確認してみます
buf := dbr.NewBuffer()
stmt.Build(dialect.MySQL, buf)
fmt.Println(buf.String()) // INSERT INTO `member` (`number`,`name`) VALUES (?,?), (?,?)
fmt.Println(buf.Value()) // [10 Lionel 9 Luis]
// Query を実行します
result, err := stmt.Exec()
if err != nil {
fmt.Println(err)
} else {
count, _ := result.RowsAffected()
fmt.Println(count) // 2
}
}
// これでも途中までは進むけど、Exec() できないのでよくない
stmt := dbr.InsertInto("member").
Columns("number", "name")
// これでOK
conn, _ := dbr.Open("mysql", USER+":"+PASSWORD+"@tcp("+HOST+":"+PORT+")/"+DB, nil)
sess := conn.NewSession(nil)
stmt := sess.InsertInto("member").
Columns("number", "name")
//
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment