Skip to main content

创建

创建记录

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` ...