我在使用gorm在PostgreSQL上查询一行时试图预加载一些数据
我通过belongs to
关联定义了以下类型:
type MyObject struct {
ID uint `grom:"column:id" json:"id"`
Name string `gorm:"column:name" json:"name"`
OwnerID uint `gorm:"column:owner_id" json:"owner_id"`
Owner Owner `json:"owner"`
...
}
type Owner struct {
ID uint `gorm:"column:id" json:"id"`
Name string `gorm:"column:name" json:"name"`
Config json.RawMessage `gorm:"column:config" sql:"type:json" json:"config"`
Components []uint8 `gorm:"column:components;type:integer[]" json:"components"`
}
和postgres db中的表,并按以下方式显示行
my_schema.my_object
id | name | owner_id | ...
----|-----------|-----------|-----
0 | testobj | 0 | ...
my_schema.owner
id | name | config | components
----|-----------|-----------|-----------
0 | testowner | <jsonb> | {0,1,2,3}
我正在使用gorm运行以下查询:
object := &models.MyObject{}
result := ls.Table("my_schema.my_object").
Preload("Owner").
Where("id = ?", "0").
First(object)
但是结果,在object
中,我得到了以下结构:
{"id": 0, "name": "testobj", "owner_id":0, "owner": {"id": 0, "name": "", "config": nil, "components": nil}}
我没有收到任何错误或警告在数据库创建sql脚本中指定了Foreignkey关系
#1
result := ls.Table("my_schema.my_object").
Preload("Owner").
Where("id = ?", "0").
First(object)
您期望的是result
只是gorm.DB
对象。真正的结果是您正确传递给object
的First()
。所以,您根本不在这里检查错误,请将其更改为:
err := ls.Table("my_schema.my_object").Preload("Owner").Where("id = ?", "0").First(object).Error fmt.Println(err)
#2
gorm.Tabler()
接口或使用过gorm.DefaultTableNameHandler
;我真的怀疑"my_schema.my_object"
是正确的表名。它应该是您的结构名称为"my_object"
的snake_case。根据您的用例,我建议使用Model(models.MyObject{})
而不是Table()
,这会为您免费提供一些类型安全性。
ID
是主键,我不确定查找ID == 0
是否有意义,因为起始值为1
。