GORM中SetupJoinTable的使用时机:每次创建连接都需调用吗?
GORM自定义关联表查询报错:表不存在的解决方案
是的,每次创建新的GORM DB实例(也就是每次调用GetGorm()获取连接)时,都需要调用SetupJoinTable来注册自定义关联表映射。
原因说明
GORM的关联规则是绑定在具体DB实例上的,每个新生成的DB实例默认不会自动识别你定义的自定义关联表与模型之间的映射关系。只有通过SetupJoinTable显式声明,GORM才知道Foo的Bars关联、Bar的Foos关联对应的是FooBar这个自定义关联表模型,查询时才能正确关联到对应的数据库表。
代码对比
无法正常运行的代码(未注册关联表)
db, err := GetGorm() if err != nil { panic(err) } var l Foo db = db.Model(&l).Joins("Bars").Find(&l) if db.Error != nil { panic(db.Error) } println("size of bars is", len(l.Bars))
正常运行的代码(已注册关联表)
db, err := GetGorm() if err != nil { panic(err) } _ = db.SetupJoinTable(&Foo{}, "Bars", &FooBar{}) _ = db.SetupJoinTable(&Bar{}, "Foos", &FooBar{}) var l Foo db = db.Model(&l).Joins("Bars").Find(&l) if db.Error != nil { panic(db.Error) } println("size of bars is", len(l.Bars))
优化建议
- 实际业务代码里不要忽略
SetupJoinTable的返回错误,应该判断并处理err,避免潜在的配置失败问题 - 可以把
SetupJoinTable的注册逻辑封装到GetGorm()函数内部,这样每次获取DB实例时都会自动完成关联表注册,不用在业务代码里重复写
内容的提问来源于stack exchange,提问作者Arthur Andrade
相关产品推荐
相关产品推荐

