使用gorm 插入數據的時候,根據官方文檔可以使用Create
或者FirstOrCreate()
. 但是官方沒有提供批量插入數據的方法.
根據github
的 issue得知,我們可以通過自己拼接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
方法