创建
创建记录
user := User{Name: "Jinzhu", Age: 18, Birthday: time.Now()}
result := db.Create(&user) // 通过数据的指针来创建
user.ID // 返回插入数据的主键
result.Error // 返回 error
result.RowsAffected // 返回插入记录的条数
选定字段创建
使用 Select 指定要使用的字段,或使用 Omit 忽略字段。
db.Select("Name", "Age", "CreatedAt").Create(&user)
// INSERT INTO `users` (`name`,`age`,`created_at`) VALUES ("Jinzhu", 18, "2020-07-04 11:05:21.775")
db.Omit("Name", "Age", "CreatedAt").Create(&user)
// INSERT INTO `users` (`birthday`,`updated_at`) VALUES ("2020-01-01 00:00:00.000", "2020-07-04 11:05:21.775")
批量插入
要有效地插入大量记录,请将切片传递给 Create 方法。GORM 将生成单个 SQL 语句来插入所有数据。
var users = []User{{Name: "jinzhu1"}, {Name: "jinzhu2"}, {Name: "jinzhu3"}}
db.Create(&users)
for _, user := range users {
user.ID // 1, 2, 3
}
使用 CreateInBatches 指定每批的大小:
var users = []User{{Name: "jinzhu_1"}, ...., {Name: "jinzhu_10000"}}
// 每次批量插入 100 条
db.CreateInBatches(users, 100)
根据 Map 创建
GORM 支持根据 map[string]interface{} 或 []map[string]interface{} 创建记录。
db.Model(&User{}).Create(map[string]interface{}{
"Name": "jinzhu", "Age": 18,
})
// 批量插入
db.Model(&User{}).Create([]map[string]interface{}{
{"Name": "jinzhu_1", "Age": 18},
{"Name": "jinzhu_2", "Age": 20},
})
注意: 使用 Map 创建时,钩子 (Hooks) 不会被触发,并且关联也不会被保存,也不会自动填充
UpdatedAt等字段。
关联创建
创建关联数据时,如果关联模型未保存,GORM 会自动保存关联及其引用。
type User struct {
gorm.Model
Name string
CreditCard CreditCard
}
type CreditCard struct {
gorm.Model
Number string
UserID uint
}
db.Create(&User{
Name: "jinzhu",
CreditCard: CreditCard{Number: "411111111111"},
})
// INSERT INTO `users` ...
// INSERT INTO `credit_cards` ...