什么是ORM,什么是字段过滤?
字段过滤是在数据处理过程中,根据特定的条件筛选出需要的字段,排除不需要的字段的操作。在 Go 电商项目 ORM(对象关系映射,Object Relational Mapping,一种程序技术,用于在关系型数据库和对象之间建立联系,方便开发者通过操作对象来操作数据库)中,字段过滤有着广泛的应用。
假设在一个 Go 电商项目中,有一个Product结构体用于表示商品信息,它可能包含ID、Name、Price、Description、Stock、CategoryID等多个字段。而在某些业务场景下,比如在商品列表页面展示商品时,只需要展示商品的ID、Name和Price,不需要展示商品的详细描述Description、库存Stock以及所属分类的CategoryID 。这时候就可以使用字段过滤,只获取ID、Name和Price这几个字段的数据,而不获取其他字段的数据,这样能减少数据传输量,提高系统性能。
本次学习的是ORM的修改相关内容(含有字段过滤)参照【王中阳GO电商实战04】
backend_roration.go的编码规范:
从fouce_single中的api_vi_content.go的ContentUpadtaeReq 结构体复制内容,到goframe项目backend.roration下,结构体改名改名为RotationUpadtaeReq,"content"替换为"rotation";把“内容”改为"轮播图":
剩下这些字段:
再更改type字段相关内容和插入跳转链接link以及排序功能:
注意:如果不是必须传数据的可以不写"v"部分内容,v部分内容没有传入参数而返回的报错信息
model_rotation.go的编码规范(复用,保证数据重合)
参照官方fouce_sigle文档的model_content.go的“修改内容”结构体,复制过来改名字
操作完成如下:
logic_ritation.go的编写规范
同上操作,复制参照fouce-single的logci里面的content内容到goframeshop项目的logic层
同上步骤完成对应的命名替换:
不需要登录的相关操作,可以去掉最后一行
更改后如下:
Update函数的内容解释:
// Update 修改
func (s *sRotation) Update(ctx context.Context, in model.RotationUpdateInput) error {
return dao.RotationInfo.Transaction(ctx, func(ctx context.Context, tx *gdb.TX) error {
// 不允许HTML代码
if err := ghtml.SpecialCharsMapOrStruct(in); err != nil {
return err
}
_, err := dao.RotationInfo.
Ctx(ctx).
Data(in).
FieldsEx(dao.RotationInfo.Columns().Id).
Where(dao.RotationInfo.Columns().Id, in.Id).
Update()
return err
})
}
dao.RotationInfo:表示数据库操作对象,用于操作与轮播图信息相关的数据表。Ctx(ctx):设置数据库操作的上下文为传入的ctx,用于控制数据库操作的生命周期,比如在事务中传递事务上下文,确保操作在事务内执行。Data(in):将输入参数in中的数据作为更新的数据来源,告诉数据库更新操作要使用这些数据。FieldsEx(dao.RotationInfo.Columns().Id):指定更新操作忽略Id字段,即除了Id字段外,其他在in中的字段对应的值会被更新。(即字段过滤)Where(dao.RotationInfo.Columns().Id, in.Id):设置更新条件,只有Id等于in.Id的记录会被更新。Update():执行数据库的更新操作。返回值第一个是更新的结果(这里用_忽略),第二个是错误信息,如果更新过程中出现错误,err会被赋值,最后返回这个错误;如果更新成功,err为nil,方法返回nil。
field方法系列的查询和写入过滤
在 GoFrame 中,Fields系列方法用于对数据库表字段进行灵活的操作过滤,包括Fields和FieldsEx方法:
Fields方法:用于指定需要操作的表字段,可应用于查询字段、写入字段、更新字段等过滤场景。假设user表有uid、nickname、passport、password这 4 个字段,在查询字段过滤时,使用g.Model("user").Fields("uid,nickname").Order("uid asc").All(),生成的 SQL 语句为SELECTuid,nicknameFROMuserORDER BYuidasc,只查询uid和nickname字段;在写入字段过滤时,通过构建g.Map数据并使用Fields指定字段,如g.Model(table).Fields("nickname,passport,password").Data(m).Insert(),生成的 SQL 语句为INSERT INTOuser(nickname,passport,password) VALUES('我是好人','shabi','123456'),仅插入指定的nickname、passport、password字段123。FieldsEx方法:用于例外的字段指定,同样可用于查询字段、写入字段、更新字段等过滤。以user表为例,在查询字段排除时,g.Model("user").FieldsEx("passport, password").All()会生成SELECTuid,nicknameFROMuser的 SQL 语句,排除passport和password字段进行查询;在写入字段排除时,使用g.Model(table).FieldsEx("uid").Data(m).Insert(),生成的 SQL 语句为INSERT INTOuser(nickname,passport,password) VALUES('我是好人','shabi','123456'),插入数据时排除uid字段456。在 GoFrame 中,Fields系列方法用于对数据库表字段进行灵活的操作过滤,包括Fields和FieldsEx方法:Fields方法:用于指定需要操作的表字段,可应用于查询字段、写入字段、更新字段等过滤场景。假设user表有uid、nickname、passport、password这 4 个字段,在查询字段过滤时,使用g.Model("user").Fields("uid, nickname").Order("uid asc").All(),生成的 SQL 语句为SELECTuid,nicknameFROMuserORDER BYuidasc,只查询uid和nickname字段;在写入字段过滤时,通过构建g.Map数据并使用Fields指定字段,如g.Model(table).Fields("nickname,passport,password").Data(m).Insert(),生成的 SQL 语句为INSERT INTOuser(nickname,passport,password) VALUES('我是好人','shabi','123456'),仅插入指定的nickname、passport、password字段123。FieldsEx方法与前面相反:用于例外的字段指定,同样可用于查询字段、写入字段、更新字段等过滤。以user表为例,在查询字段排除时,g.Model("user").FieldsEx("passport, password").All()会生成SELECTuid,nicknameFROMuser的 SQL 语句,排除passport和password字段进行查询;在写入字段排除时,使用g.Model(table).FieldsEx("uid").Data(m).Insert(),生成的 SQL 语句为INSERT INTOuser(nickname,passport,password) VALUES('我是好人','shabi','123456'),插入数据时排除uid字段456。
omit系列的空值过滤
omit系列方法用于对数据进行空值过滤,以确保在数据库操作时,空值字段不会被意外处理。这系列方法主要包括OmitEmpty、OmitNil以及它们各自针对Where条件和Data数据的特定过滤方法
OmitNil方法:当map/struct中存在空值如nil时,默认gdb会将其当作正常输入参数更新到数据表。OmitNil特性可在数据写入数据库前过滤值为nil的空值字段,其他空值如""、0不会被过滤。功能定义:当map/struct中存在空值如nil时,默认情况下,gdb会将其当作正常的输入参数更新到数据表。OmitNil 特性可以过滤掉这些值为nil的空值字段,但其他空值如""、0并不会被过滤 。例如,在执行数据库写入操作时,如果数据中有字段值为nil,使用 OmitNil 相关方法可以不让这些字段参与写入操作。OmitEmpty方法:当map/struct中存在空值如nil、""、0时,默认情况下,gdb会将其当作正常参数更新到数据表。OmitEmpty特性可在数据写入数据库前过滤这些空值数据的字段。相关方法有:
写完logic后会自动生成service
参照fouce_single的controller更新方法
写入goframeshop项目的controller中,同上面操作,改好名字,删除多余字段
详细内容参考juejin.cn/post/716569…