Golang 预加载
Golang gorm preloading
我正在用 golang 编写我的第一个应用程序,很抱歉新手问题,但我无法找到以下问题的解决方案:
我有两个表,position 和 attachment。每个位置可以有多个附件。这是我的模型:
type Positions struct {
Sys_id int `gorm:"AUTO_INCREMENT" gorm:"column:sys_id" json:"sys_id,omitempty"`
Name string `gorm:"size:120" gorm:"column:name" json:"name,omitempty"`
OpenPositions int `gorm:"column:open_positions" json:"open_positions,omitempty"`
ContactList string `gorm:"size:1000" gorm:"column:contact_list" json:"contact_list,omitempty"`
Attachments []Attachment `gorm:"ForeignKey:RecordId"`
}
type Attachment struct {
Sys_id int `gorm:"AUTO_INCREMENT" gorm:"column:sys_id" json:"sys_id"`
Name string `gorm:"size:255" gorm:"column: name" json:"name"`
File string `gorm:"size:255" gorm:"column:file" json:"file"`
RecordId int `gorm:"column:record_id" json:"record_id"`
Table string `gorm:"size:255" gorm:"column:table" json:"table"`
// ...
}
我想查询数据库并获得 positions with attachments
positions2 := []models.Positions{}
err := db.Where("open_positions > ?", 0).Preload("Attachments", "`table` = ?", "user_position").Find(&positions2)
if err != nil {
log.WithFields(log.Fields{
"type": "queryerr",
"msg": err,
}).Error("faked up query")
}
此查询的结果 - 我正确地获得了职位,但附件是空的。
(can't preload field Attachments for models.Positions)
level=error msg="faked up query" msg=&{0xc04200aca0 can't preload field Attachments for models.Positions 6 0xc042187e40 0xc042187d90 0xc0422cd4a0 0 {0xc042225130} false map[] map[] false}
在此先感谢您的帮助
看起来它不是关于 Go 或 Gorm,而是关于 SQL。
W3学校:
A FOREIGN KEY in one table points to a PRIMARY KEY in another table.
但是 RecordId
不是您模型中的主键。让外键引用主键。它应该固定为:
RecordId int `gorm:"column:record_id" gorm:"primary_key" json:"record_id"`
您示例中的模型具有自定义主列名称。
因此,当只有 ForeignKey 设置为 "has_many" 关联时,Gorm 试图找到 Position 的列 Attachment.RecordId 引用。
默认情况下,它使用 Position 作为前缀,使用 Id 作为列名。但是 RecordId 列没有前缀 Position,Position 模型也没有列 Id,所以失败了。
在这种情况下,对于 "has_many" 关联,您应该同时指定外键和关联外键。
在您的示例中,关联外键是 Position.Sys_id 列,Attachment.RecordId 引用它。
所以应该通过添加关联外键来修复它:
Attachments []Attachment `gorm:"ForeignKey:RecordId;AssociationForeignKey:sys_id"`
我正在用 golang 编写我的第一个应用程序,很抱歉新手问题,但我无法找到以下问题的解决方案:
我有两个表,position 和 attachment。每个位置可以有多个附件。这是我的模型:
type Positions struct {
Sys_id int `gorm:"AUTO_INCREMENT" gorm:"column:sys_id" json:"sys_id,omitempty"`
Name string `gorm:"size:120" gorm:"column:name" json:"name,omitempty"`
OpenPositions int `gorm:"column:open_positions" json:"open_positions,omitempty"`
ContactList string `gorm:"size:1000" gorm:"column:contact_list" json:"contact_list,omitempty"`
Attachments []Attachment `gorm:"ForeignKey:RecordId"`
}
type Attachment struct {
Sys_id int `gorm:"AUTO_INCREMENT" gorm:"column:sys_id" json:"sys_id"`
Name string `gorm:"size:255" gorm:"column: name" json:"name"`
File string `gorm:"size:255" gorm:"column:file" json:"file"`
RecordId int `gorm:"column:record_id" json:"record_id"`
Table string `gorm:"size:255" gorm:"column:table" json:"table"`
// ...
}
我想查询数据库并获得 positions with attachments
positions2 := []models.Positions{}
err := db.Where("open_positions > ?", 0).Preload("Attachments", "`table` = ?", "user_position").Find(&positions2)
if err != nil {
log.WithFields(log.Fields{
"type": "queryerr",
"msg": err,
}).Error("faked up query")
}
此查询的结果 - 我正确地获得了职位,但附件是空的。
(can't preload field Attachments for models.Positions) level=error msg="faked up query" msg=&{0xc04200aca0 can't preload field Attachments for models.Positions 6 0xc042187e40 0xc042187d90 0xc0422cd4a0 0 {0xc042225130} false map[] map[] false}
在此先感谢您的帮助
看起来它不是关于 Go 或 Gorm,而是关于 SQL。
W3学校:
A FOREIGN KEY in one table points to a PRIMARY KEY in another table.
但是 RecordId
不是您模型中的主键。让外键引用主键。它应该固定为:
RecordId int `gorm:"column:record_id" gorm:"primary_key" json:"record_id"`
您示例中的模型具有自定义主列名称。 因此,当只有 ForeignKey 设置为 "has_many" 关联时,Gorm 试图找到 Position 的列 Attachment.RecordId 引用。 默认情况下,它使用 Position 作为前缀,使用 Id 作为列名。但是 RecordId 列没有前缀 Position,Position 模型也没有列 Id,所以失败了。
在这种情况下,对于 "has_many" 关联,您应该同时指定外键和关联外键。
在您的示例中,关联外键是 Position.Sys_id 列,Attachment.RecordId 引用它。
所以应该通过添加关联外键来修复它:
Attachments []Attachment `gorm:"ForeignKey:RecordId;AssociationForeignKey:sys_id"`