go-pg多表关联查询异常:嵌套Relation触发reflect零值Panic
我碰到过类似的go-pg嵌套关联查询的panic问题,你的错误reflect: call of reflect.Value.Type on zero Value大概率是两个原因之一,咱们一步步解决:
1. 先检查你的tableA变量初始化是否正确
go-pg的Model()方法需要接收一个非nil的指针(或者值类型的指针),如果你的tableA是个未初始化的nil指针,比如:
var tableA *TableA // 这时候tableA是nil pgdb.Model(&tableA) // 传入的是**TableA,指向nil
这种情况会导致反射时访问零值的Type方法,直接panic。
修复方式:确保传入Model的是有效的指针实例:
// 方式1:用值类型的指针 var tableA TableA err := pgdb.Model(&tableA).Where("id = ?", targetID).Relation("TableBs.TableC").Select() // 方式2:初始化指针实例 var tableA *TableA = &TableA{} err := pgdb.Model(tableA).Where("id = ?", targetID).Relation("TableBs.TableC").Select()
2. 嵌套关联查询的正确写法
你尝试用回调函数嵌套Relation("TableC")其实没必要(除非你需要给TableBs加过滤条件),go-pg支持直接用点语法来链式关联嵌套的模型,写法更简洁也不容易出错:
// 直接关联TableBs和其对应的TableC err := pgdb.Model(&tableA).Relation("TableBs").Relation("TableBs.TableC").Where("id = ?", targetID).Select()
如果确实需要给TableBs的查询加额外条件(比如过滤某个Name),再用回调函数,这时候要确保回调里的Query是针对TableB模型的,写法如下:
err := pgdb.Model(&tableA).Relation("TableBs", func(q *orm.Query) (*orm.Query, error) { // 这里的q是TableB的查询,可以加过滤条件,同时关联TableC return q.Relation("TableC").Where("name LIKE ?", "%example%"), nil }).Where("id = ?", targetID).Select()
验证修复
按照上面的方式调整后,应该就能正常查询到TableA关联的TableBs,以及每个TableB对应的TableC详情了。
内容的提问来源于stack exchange,提问作者Davood
相关产品推荐
相关产品推荐

