红魔咖啡馆

头发越掉越多,头发越掉越少

0%

【GORM】创建操作

创建数据

使用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)