Golang GORM中Has Many关联未写入数据库问题求助
解决GORM一对多关联查询不到数据的问题
兄弟,我一眼就瞅出你这问题的关键啦!你的关联字段配置错了,而且查询的时候没触发关联加载,这俩点加起来就导致你查不到关联的Holdings数据。
问题分析
你给Previous.Holdings设置的gorm:"foreignkey:ID"是错误的:这里的foreignkey指的是Holding表中用来关联Previous的字段,而不是Previous自己的ID。你现在相当于让Holding用自己的主键去关联Previous,这完全不对嘛!
修正步骤
- 第一步:给Holding结构体添加外键字段
你需要在Holding里加一个PreviousID uint字段,用来存储对应的Previous记录的ID,这才是关联的关键。 - 第二步:修正Previous的关联标签
把Holdings的标签改成gorm:"foreignkey:PreviousID",告诉GORM用Holding的PreviousID字段来关联Previous的主键ID。 - 第三步:查询时使用
Preload加载关联数据
GORM默认不会自动加载关联数据,你得显式用Preload方法,不然直接查主表只会返回Previous的数据,不会带上Holdings。
修正后的代码示例
import ( orm "github.com/jinzhu/gorm" _ "github.com/jinzhu/gorm/dialects/sqlite" ) type Previous struct { orm.Model Holdings []Holding `gorm:"foreignkey:PreviousID"` // 指向Holding的外键字段 } type Holding struct { orm.Model // 建议用gorm内置Model,自带ID、CreatedAt等字段,不用手动定义ID PreviousID uint // 新增外键字段,关联Previous的ID // 你的其他业务字段... }
查询示例
要这样查才能加载关联的Holdings:
// 查询单条记录并加载关联 var previous Previous db.Preload("Holdings").First(&previous) // 查询所有记录并加载关联 var previousList []Previous db.Preload("Holdings").Find(&previousList)
另外还要注意:如果你的数据库里已经有Holding数据,得确保这些数据的previous_id字段(GORM会自动把结构体的PreviousID转成蛇形命名的数据库字段)正确对应到Previous表的id值,不然配置对了也查不到关联数据哦!
内容的提问来源于stack exchange,提问作者jack sexton
相关产品推荐
相关产品推荐

