有些数据库,比如MySQL支持一次性插入多条数据的语法,当然也有些数据库不支持。这里演示了两种方法,一种适用于支持多条数据插入语法的数据库,另外一个适用于不支持多条数据插入语法的数据库,两者都能实现一次性插入多条数据的功能。
这里用到的两个方法:InsertMulti
和PrepareInsert
的原型如下:
func (o *querySet) PrepareInsert() (Inserter, error)
func (o *orm) InsertMulti(bulk int, mds interface{}) (int64, error)
不多说,上代码:
package main
import (
"fmt"
"github.com/astaxie/beego/orm"
_ "github.com/go-sql-driver/mysql"
)
const (
DRIVER_NAME = "mysql"
DATA_SOURCE = "root:root@tcp(localhost:3306)/beegodb?charset=utf8&loc=Asia%2FShanghai"
MAX_IDLE_CONN = 5
MAX_OPEN_CONN = 30
)
type User struct {
Id int
Name string `orm:"size(20)"`
Email string `orm:"size(50)"`
Age int
IsActive bool
}
func registerDB() {
orm.Debug = true
orm.RegisterDataBase("default", DRIVER_NAME, DATA_SOURCE, MAX_IDLE_CONN, MAX_OPEN_CONN)
orm.RegisterModel(new(User))
orm.RunCommand()
}
func multiInsertUsers() {
users := []User{
User{Name: "jemy", Email: "jemy@golanghome.com", Age: 25},
User{Name: "john", Email: "john@golanghome.com", Age: 24},
User{Name: "amy", Email: "amy@golanghome.com", Age: 22},
User{Name: "steven", Email: "steven@golanghome.com", Age: 26},
User{Name: "dolphin", Email: "dolphin@golanghome.com", Age: 21},
User{Name: "alex", Email: "alex@golanghome.com", Age: 32},
User{Name: "bob", Email: "bob@golanghome.com", Age: 25},
User{Name: "thomas", Email: "thomas@golanghome.com", Age: 25},
User{Name: "chris", Email: "chris@golanghome.com", Age: 38},
User{Name: "peter", Email: "peter@golanghome.com", Age: 40},
}
createUsers1(users)
fmt.Println("----------------------------------------------")
createUsers2(users)
}
func createUsers1(users []User) {
if num, err := orm.NewOrm().InsertMulti(len(users), users); err != nil {
fmt.Println(err)
} else {
fmt.Printf("Insert %d users' data!\r\n", num)
}
}
func createUsers2(users []User) {
inserter, _ := orm.NewOrm().QueryTable("user").PrepareInsert()
for _, user := range users {
inserter.Insert(&user)
}
}
func main() {
registerDB()
multiInsertUsers()
}
在第一个函数
createUsers1
里面,我们使用beego的orm提供的
InsertMulti
方法来一次性插入多条数据。在第二个函数
createUsers2
里面,我们使用orm的
PrepareInsert
方法先创建一个
inserter
插入器,这个
inserter
可以用来多次插入数据。对于整个函数来讲,就是一次性插入多条数据了。
createUsers2
使用了PrepareInsert,记得结束的时候要关闭掉。如下:
func createUsers2(users []User) {
inserter, _ := orm.NewOrm().QueryTable("user").PrepareInsert()
for _, user := range users {
inserter.Insert(&user)
}
inserter.Close()
}