我正在用golang编写我的第一个应用程序,对于新手的问题很抱歉,但我无法找到解决以下问题的方法:
我有两张桌子,一张是position,另一张是附件。每个位置可以有多个附件。这是我的模型:
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"`
// ...
}我想查询数据库并获得位置和附件
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")
}这个查询的结果-我得到正确的位置,但附件是空的。
(不能预装models.Positions字段附件) level=error msg=“伪造查询”msg=&{0xc04200aca0不能预加载models.Positions 6 0xc042187e40 0xc042187d90 0xc0422cd4a0 {0xc042225130} false map[] map[] false}
预先感谢您的帮助
发布于 2017-07-07 11:26:06
示例中的模型具有自定义主列名。因此,当只有ForeignKey设置为"has_many“关联时,Gorm试图查找位置的列Attachment.RecordId。默认情况下,它使用位置作为前缀,Id作为列名。但是,RecordId列都没有前缀位置,位置模型也没有列Id,因此失败。
对于"has_many“关联,您应该同时指定外键和关联外键。
在您的示例中,Association是Position.Sys_id列,Attachment.RecordId引用它。
因此,只需添加关联外键就可以修复:
Attachments []Attachment `gorm:"ForeignKey:RecordId;AssociationForeignKey:sys_id"`发布于 2016-12-08 16:20:01
看起来这不是关于Go或Gorm,而是关于SQL。
W3SCHOOLS:
一个表中的外键指向另一个表中的主键。
但是RecordId不是模型中的主键。让外键引用主键。应以下列方式固定:
RecordId int `gorm:"column:record_id" gorm:"primary_key" json:"record_id"`https://stackoverflow.com/questions/41040046
复制相似问题