一、基本创建
(一)单条数据创建
- 模型表
type Base struct { ID int Name string Age int }
- 方法一 通过数据的指针来创建
base := Base{Name: "lily", Age: 18} result := db.Create(&base) //通过数据指针进行创建 fmt.Println(result.Error) // 返回 error fmt.Println(result.RowsAffected) // 返回插入记录的条数
- 方法二 根据 Map 创建
db.Model(&Base{}).Create(map[string]interface{}{ "Name": "kiki", "Age": 20, })
(二)批量创建
- 方法一 通过数据的指针来创建
要有效地插入大量记录,请将一个 slice 传递给 create方法。 GORM 将生成单独一条SQL语句来插入所有数据,并回填主键的值,钩子方法也会被调用。
var baseUsers = []Base{ { Name: "kiki", Age: 20, }, { Name: "wan", Age: 22, }, } db.Create(&baseUsers) // 创建多条记录 for _, user := range baseUsers { fmt.Println(user.ID) //回填主键的值 }
使用 CreateInBatches分批创建时,你可以指定每批的数量
var baseUsers = []Base{ { Name: "kiki", Age: 20, }, { Name: "wan", Age: 22, }, ... } db.CreateInBatches(&baseUsers, 100) // 每次插入100条
- 方法二 根据Map创建
db.Model(&Base{}).Create([]map[string]interface{}{ { "Name": "kiki", "Age": 20, }, { "Name": "wan", "Age": 22, }, })
二、创建进阶
(一)指定字段创建
// 创建记录并更新给出的字段 baseUser := Base{Name: "lily", Age: 18} //db.Select("Name", "Age").Create(&baseUser) // INSERT INTO `Base` (`name`,`age`) VALUES ("lily", 18) // 创建一个记录且一同忽略传递给略去的字段值, 此时Name取默认值为空 db.Omit("Name").Create(&baseUser) // INSERT INTO `Base` (`age`) VALUES (18)
(二)关联创建
如果一个模型嵌套另一个模型,那么怎么创建数据呢?
- 模型表
type Base struct { ID int Name string Age int `gorm:"default:20"` //指定默认值为20 } type User struct { Base Base `gorm:"embedded;embeddedPrefix:base_"` NickName string }
- 创建
// 关联创建, 如果没写字段使用默认值创建 db.Create(&User{ NickName: "小花", Base: Base{ Name: "xiaohua", }, })
也可以通过 Select、 Omit 跳过关联保存,例如:
db.Omit("Base").Create(&User) // 跳过所有关联 db.Omit(clause.Associations).Create(&User)