哪里有网站建设服务,阐述网络营销策略的内容,网页制作简单教程,网站名称和备案的不一样目录 模型定义使用Create创建记录一次性创建多条数据批量插入数据时开启事务默认值问题 模型定义
定义一个PersonInfo结构体。
type PersonInfo struct {Id uint64 gorm:column:id;primary_key;NOT NULL json:idUserName string gorm:co… 目录 模型定义使用Create创建记录一次性创建多条数据批量插入数据时开启事务默认值问题 模型定义
定义一个PersonInfo结构体。
type PersonInfo struct {Id uint64 gorm:column:id;primary_key;NOT NULL json:idUserName string gorm:column:username;unique;NOT NULL json:usernamePassword string gorm:column:password json:passwordAge 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 uint64UserName stringPassWord string gorm:default:000000Age int gorm:default:18
}如果没有指定passwordpassword就为000000如果没有指定ageage就为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为000000age为18。所以当使用了tag的默认值功能的时候其字段的零值, 比如0, “”,false或者其它零值都不会保存到数据库内而是使用他们的默认值。 如果想避免这种情况可以考虑使用指针或实现 Scanner/Valuer接口 1.使用指针方式实现零值存入数据库 使用指针重新定义模型将原来的string类型和int类型改为 *string 和 *int 类型。
type User struct {Id uint64UserName stringPassWord *string gorm:default:000000Age *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 uint64UserName stringPassWord 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)运行完成后查询结果如下