如何在Go-PG中通过关联查询同时获取主实体与关联表实体?
问题解决方法
首先,你的代码存在两个核心问题:
- 结构体语法错误:
Book结构体里定义了两个同名的Author字段,Go语言不允许结构体有重复字段名,必须先修正这一点。 - 字段映射不匹配:原生SQL的
SELECT *会返回book和author表的所有列,但Book结构体中没有对应author表字段(比如报错里的name)的成员,导致ORM无法映射。
步骤1:修正结构体定义
把重复的Author字段改名,区分开ID字段和关联结构体:
type Book struct { tableName struct{} `pg:"book" json:"-"` Id int `pg:"id,pk" json:"id"` AuthorID int `pg:"author_id,notnull" json:"-"` // 重命名避免字段冲突 Author *Author `pg:"fk:author_id" json:"author,omitempty"` }
步骤2:正确加载关联数据
有两种推荐方式实现关联查询:
方式一:使用go-pg内置关联查询(推荐)
利用ORM的Relation方法自动处理关联加载,无需手写复杂SQL:
var books []model.Book err := dao.FusedDb.Model(&books).Relation("Author").Select() if err != nil { // 错误处理逻辑 }
框架会自动生成JOIN语句,并正确将author表的数据映射到Book.Author字段。
方式二:手写SQL指定字段映射
如果必须使用原生SQL,需要给author表的字段加上author__前缀,让ORM识别并映射到嵌套的Author结构体:
var r []model.Book _, err := dao.FusedDb.Query(&r, ` SELECT b.id, b.author_id, a.id AS author__id, a.name AS author__name -- 根据你的Author结构体字段调整 FROM book b INNER JOIN author a ON a.id = b.author_id `)
注意:要根据实际的Author结构体字段,对应修改SELECT中的别名和字段名。
临时规避方案(不推荐)
如果只是想先消除报错,不加载关联数据,可以在查询时添加DiscardUnknownColumns选项,让ORM忽略未匹配的字段:
import "github.com/go-pg/pg/v10" var r []model.Book _, err := dao.FusedDb.Query(&r, ` SELECT * FROM book b INNER JOIN author a on a.id = b.author_id `, pg.DiscardUnknownColumns)
但此方法无法获取Author数据,仅用于临时调试。
内容的提问来源于stack exchange,提问作者evrei666
相关产品推荐
相关产品推荐

