三件套二 | 青训营笔记

71 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 17 天

gorm的基础使用

使用clause.onconflict处理数据冲突,来进行upsert,使用默认值的话,是通过default标签为字段定义默认值。(可以类比于结构体)

gorm查询数据

first的使用踩坑:使用first时,需要注意查询不到数据会返回errrecordnotfound。使用find查询多条数据,查询不到数据不会返回错误。

使用结构体作为查询条件:当使用结构作为条件查询时,gorm只会查询非零值字段,就意味着如果您的字段值为0,,false或其他零值,该字段不会被使用于构建查询条件,使用map来构建查询条件。

gorm更新数据

使用struct更新时,只会更新非零值,如果需要更新零值可以使用map更新或使用select选择字段。

gorm删除数据

gorm提供了gorm.deletedat用于帮助用户实现软删,拥有软删能力的model调用delete时候,记录不会被从数据库真正删除,但grom会将deleteat置为当前时间,并且你不能再通过正常的查询方法找到该记录。

使用unscoped可以查询到被软删的数据。

gorm事务

gorm提供了begin,commit,rollback方法用于使用事务。

gorm提供了tansaction方法用于提交事务,避免用户漏写commit,rollback。

gorm hook

gorm在提供curd的hook能力,hook是在创建,查询,更新,删除等操作之前,之后凋i用的函数。

如果任何hook返回错误,goprm将停止后续的操作并回滚事务。

gorm性能提高

对于写操作(创建,更新,删除),为了确保数据的完整性,gorm会将他们封装在事务内运行,但这会降低性能,你可以使用skipdefaulttransactionguanbi默认事务。

使用preparestmt缓存预编语句可以提高后续调用的能力。

gorm生态

gorm拥有非常丰富的扩展生态。