目录
- 模型定义
- 使用Create创建记录
- 一次性创建多条数据
- 批量插入数据时开启事务
- 默认值问题
模型定义
定义一个PersonInfo结构体。
type PersonInfo struct {
Id uint64 `gorm:"column:id;primary_key;NOT NULL" json:"id"`
UserName string `gorm:"column:username;unique;NOT NULL" json:"username"`
Password string `gorm:"column:password" json:"password"`
Age int `gorm:"column:age" json:"age"`
}
使用Create创建记录
Create方法用于创建一条新的数据记录,并将其保存到数据库中。使用该方法时,需要传入一个指针,表示要创建的数据记录。
p1 := connect.PersonInfo{
Id: 1,
UserName: "abc",
Password: "12345",
Age: 19,
}
connect.DB.Create(&p1)
运行完成后,查询结果如下:
一次性创建多条数据
第一种方法:使用 Create() 创建多项记录:
p := []*connect.PersonInfo{
{Id: 2, UserName: "def", Password: "56789", Age: 20},
{Id: 3, UserName: "xyz", Password: "09876", Age: 22},
}
connect.DB.Create(&p)
运行完成后,查询结果如下:
第二种方法:使用 CreateInBatches()方法。该方法可以一次性将多条数据记录批量插入到数据库中,从而提高插入数据的效率。CreateInBatches 方法的用法与 Create 方法基本相同,只是需要传入一个额外的参数,表示每批次插入的数据记录数量。使用CreateInBatches方法的好处就是CreateInBatches方法能够保证原子性,如果其中一条数据插入失败,则整个插入操作都会进行回滚。
p := []connect.PersonInfo{
{Id: 4, UserName: "drg", Password: "5622", Age: 25},
{Id: 5, UserName: "tes", Password: "0955", Age: 26},
}
connect.DB.CreateInBatches(p, 2)
运行完成后,查询结果如下:
批量插入数据时开启事务
p := []connect.PersonInfo{
{Id: 6, UserName: "edg", Password: "6722", Age: 24},
{Id: 7, UserName: "dyg", Password: "0395", Age: 23},
}
tx := connect.DB.Begin() //开启事务
for _, value := range p {
tx.Create(&value)
}
tx.Commit() //提交事务
运行完成后,查询结果如下:
上面的示例代码中,首先定义了一个名为p的结构体切片,其中包含2条数据记录。然后,调用 Begin 方法开启一个事务,循环遍历 p 切片,调用 Create 方法插入每条数据记录,最后调用 Commit 方法提交事务。与 CreateInBatches 方法类似,如果其中任何一个数据记录插入失败,整个事务都会回滚。
默认值问题
定义如下模型:
type User struct {
Id uint64
UserName string
PassWord string `gorm:"default:'000000'"`
Age int `gorm:"default:18"`
}
如果没有指定password,password就为000000;如果没有指定age,age就为18。
u := connect.User{
Id: 1,
UserName: "aaa",
}
connect.DB.Create(&u)
**注意:**通过tag定义字段的默认值,在创建记录时候生成的 SQL 语句会排除没有值
或值为零值
的字段。 在将记录插入到数据库后,Gorm会从数据库加载那些字段的默认值。举个例子:
u := connect.User{
Id: 2,
UserName: "bbb",
PassWord: "",
Age: 0,
}
connect.DB.Create(&u)
运行完成后,查询结果如下:
可以看到,上面代码的执行结果并不是password为空值,age为0。而是password为000000,age为18。所以,当使用了tag的默认值功能的时候,其字段的零值, 比如0, “”,false或者其它零值,都不会保存到数据库内,而是使用他们的默认值。 如果想避免这种情况,可以考虑使用指针
或实现 Scanner/Valuer
接口,
1.使用指针方式实现零值存入数据库
使用指针重新定义模型:(将原来的string类型和int类型改为 *string 和 *int 类型。)
type User struct {
Id uint64
UserName string
PassWord *string `gorm:"default:'000000'"`
Age *int `gorm:"default:18"`
}
使用new函数进行赋值:
u := connect.User{
Id: 2,
UserName: "bbb",
PassWord: new(string),
Age: new(int),
}
connect.DB.Create(&u)
运行完成后,查询结果如下:
这样各种类型的零值或空值字段就能插入数据库了。
2.使用Scanner/Valuer接口方式实现零值存入数据库
模型定义如下:(将原来的string类型和int类型改为 sql.NullString 和 sql.NullInt64 类型。)
type User struct {
Id uint64
UserName string
PassWord sql.NullString `gorm:"default:'000000'"` // sql.NullString 实现了Scanner/Valuer接口
Age sql.NullInt64 `gorm:"default:18"` // sql.NullInt64 实现了Scanner/Valuer接口
}
赋值如下:
u := connect.User{
Id: 3,
UserName: "bing",
PassWord: sql.NullString{String: "", Valid: true},
Age: sql.NullInt64{Int64: 0, Valid: true},
}
connect.DB.Create(&u)
运行完成后,查询结果如下: