创建数据
使用db.Create(&name)创建一条数据
批量插入
若想创建多条数据,可以创建一个切片并把数据填进去
1
2
3
4
5
6
users := []*User{
{Name: "Jinzhu", Age: 18, Birthday: time.Now()},
{Name: "Jackson", Age: 19, Birthday: time.Now()},
}
result := db.Create(users)可以用db.CreateInBatches()来指定插入批次的大小
1
2
3
4
var users = []User{{Name: "jinzhu_1"}, ...., {Name: "jinzhu_10000"}}
// batch size 100
db.CreateInBatches(users, 100)用指定字段创建数据
用Select创建为指定字段赋值的记录:
1
db.Select("Name", "Age", "CreatedAt").Create(&user)用Omit创建忽略指定字段值的记录:
1
db.Omit("Name", "Age", "CreatedAt").Create(&user)根据Map创建数据
支持通过 map[string]interface{} 与
[]map[string]interface{}{}来创建
1
2
3
4
5
6
7
8
9
db.Model(&User{}).Create(map[string]interface{}{
"Name": "jinzhu", "Age": 18,
})
// batch insert from `[]map[string]interface{}{}`
db.Model(&User{}).Create([]map[string]interface{}{
{"Name": "jinzhu_1", "Age": 18},
{"Name": "jinzhu_2", "Age": 20},
})默认值
在结构体中添加taggorm:"default:'value'"以设定默认值
1
2
3
4
5
type User struct {
ID int64
Name string `gorm:"default:'issac'"`
Age int64
}这样在创建一条数据的时候,不传入的部分将会设定为默认的值,若没有默认值则会传入零值
注意:所有字段的零值都不会保存到数据库里,若有默认值则会使用他们的默认值,若想传入控制可以考虑使用指针或实现Scanner/Valuer接口
例如,假设按上面定义,则u:=User{Name:"", Age:1}创建的Name仍为上面定义的默认值
指针:即定义字段时用指针类型
接口:类型值使用NullType,这种类型自然实现了这两个接口,传入的时候结构体内value要为true
扩展创建
PostgreSQL中可以使用下面的方式实现有则更新,无则插入:
1
db.Set("gorm:insert_option", "ON CONFLICT").Create(&product)