gorm 批量插入数据

使用gorm 插入数据的时候,根据官方文档可以使用Create或者FirstOrCreate(). 但是官方没有提供批量插入数据的方法.

根据githubissue得知,我们可以通过自己拼接sql语句进行批量数据插入(或许这是官方提供方法之前最好的解决方案了)具体实现如下:

假设有如下数据库表结构:

CREATE TABLE `employees` (
    `id` int(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id',
    `name` varchar(64) NOT NULL COMMENT '雇员姓名',
    `age` TINYINT(5) NOT NULL COMMENT '雇员年龄',
    `addr` varchar(64) NOT NULL COMMENT '雇员家庭地址',
     PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='雇员信息表';

批量操作如下:

// Employee ...
type Employee struct {
	Name string `gorm:"column:name"`
	Age  int    `gorm:"column:age"`
	Addr string `gorm:"column:addr"`
}

// BatchSave 批量插入数据
func BatchSave(db *gorm.DB, emps []*Employee) error {
	var buffer bytes.Buffer
	sql := "insert into `employees` (`name`,`age`,`addr`) values"
	if _, err := buffer.WriteString(sql); err != nil {
		return err
	}
	for i, e := range emps {
		if i == len(emps)-1 {
			buffer.WriteString(fmt.Sprintf("('%s','%d',%s);", e.Name, e.Age, e.Addr))
		} else {
			buffer.WriteString(fmt.Sprintf("('%s','%d',%s),", e.Name, e.Age, e.Addr))
		}
	}
	return db.Exec(buffer.String()).Error
}

后续考虑分装一下BatchCreate方法

posted @ 2019-10-31 20:10  jssyjam  阅读(20722)  评论(0编辑  收藏  举报