Golang go-pg v10指针接收者实现AfterQuery钩子不触发问题
go-pg v8升级v10 AfterQuery钩子不触发解决方案
不需要额外添加其他配置,也不需要实现其他函数,钩子未触发通常是使用方式不符合v10的钩子触发规则导致,可按以下步骤排查:
- 确认导入的是v10版本的pg包,避免新旧版本包混淆导致方法签名不匹配:
import "github.com/go-pg/pg/v10" - 确认使用ORM层
Model方法发起查询:v10的模型钩子仅对
Model()系列ORM查询生效,直接调用Query()/Exec()执行原生SQL不会触发钩子。
错误示例:
正确示例:var pm PaymentMethod // 原生SQL查询不触发钩子 _, err := db.Query(&pm, `SELECT * FROM payment_methods WHERE id = ?`, 1)var pm PaymentMethod err := db.Model(&pm).Where("id = ?", 1).Select() - 确认查询时传入的是模型指针/模型指针切片:
值类型的模型实例不会触发钩子,必须传递指针:// 错误:传值类型不触发钩子 var pm PaymentMethod err := db.Model(pm).Where("id = ?", 1).Select() // 正确:传指针类型触发钩子 var pm PaymentMethod err := db.Model(&pm).Where("id = ?", 1).Select() - 可添加编译期校验快速排查签名错误:
在代码中加入以下校验代码,如果方法签名不匹配会直接在编译阶段报错,避免肉眼漏看:var _ pg.AfterQueryHook = (*PaymentMethod)(nil) - 批量查询注意事项:
当查询模型切片时,需要传递指针切片,AfterQuery会对切片内的每个元素逐一触发:var pms []*PaymentMethod err := db.Model(&pms).Select()
内容的提问来源于stack exchange,提问作者mghifariyusuf
相关产品推荐
相关产品推荐

