You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 07:45:04