Created
December 15, 2015 11:54
-
-
Save iktakahiro/9e630967360d3f439da5 to your computer and use it in GitHub Desktop.
Go 言語 dbr で BULK INSERT ref: http://qiita.com/iktakahiro/items/490999bc34704fd71d36
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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}] |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// ここでは カラムの指定まで Query を組み立てます | |
stmt := sess.InsertInto("member"). | |
Columns("number", "name") | |
// スライスの分だけ Record() を実行します | |
for _, value := range members { | |
stmt.Record(value) | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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] |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
result, err := stmt.Exec() | |
if err != nil { | |
fmt.Println(err) | |
} else { | |
count, _ := result.RowsAffected() | |
fmt.Println(count) // 2 | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// これでも途中までは進むけど、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