GORM踩坑

320 阅读1分钟

查询数据

First 的使用踩坑

使用 First 时,需要注意查询不到数据会返回 ErrRecordNotFound. 使用 Find 查询多条数据,查询不到数据不会返回错误。

使用结构体作为查询条件

当使用结构作为条件查询时,GORM只会查询非零值字段。这意味着如果您的字段值为 0、“”、false 或其他零值,该字段不会被用于构建查询条件,使用Map来构建查询条件。

更新数据

使用 Struct 更新时,只会更新非零值,如果需要更新零值可以使用 Map 更新或使用Select 选择字段。

删除数据

GORM 提供了 gorm.DeletedAt 用于帮助用户实现软删 拥有软删除能力的 Model 调用 Delete 时,记录不会被从数据库中真正删除。但 GORM 会将 DeletedAt 置为当前时间并且你不能再通过正常的查询方法找到该记录。 使用 Unscoped 可以查询到被软删的数据

GORM HOOK

GORM 在 提供了 CURD 的 Hook 能力。 Hook 是在创建、查询、更新、删除等操作之前、之后自动调用的函数。 如果任何 Hook 返回错误,GORM 将停止后续的操作并回滚事务。

GORM 性能提高

对于写操作(创建、更新、删除) ,为了确保数据的完整性,GORM 会将它们封装在事务内运行。但这会降低性能,你可以使用SkipDefaultTransaction 关闭默认事务。 使用 PrepareStmt 缓存预编译语句可以提高后续调用的速度,本机测试提高大约 35 %左右。