Go项目中Gorm关联SQL视图与数据表的报错解决求助
解决Gorm关联SQL视图的错误
问题原因
Gorm关联时要求模型有明确的主键,且关联字段需配置正确的外键与引用关系。你的Os结构体未指定主键,同时Laudo中Os字段的关联规则不明确,导致触发报错。
修复步骤
- 为Os结构体指定主键:SQL视图虽无物理主键,但需告知Gorm用哪个字段作为关联标识,这里选择
NOs(对应视图的OSRV列)作为主键。 - 配置Laudo中Os字段的关联规则:明确外键为
Laudo的NumOsID,引用Os的NOs字段。
修改后的Os结构体
type Os struct { NOs string `json:"n_os" gorm:"primaryKey;column:OSRV"` // 添加primaryKey标签 DataOs time.Time `json:"data_os" gorm:"column:DTA_CHAM"` Descricao string `json:"descricao" gorm:"column:MOT_MANT"` Fornecedor string `json:"fornecedor" gorm:"column:NM_FRNC"` Localizacao string `json:"localizacao" gorm:"column:Localizacao"` Cidade string `json:"cidade" gorm:"column:NM_MUN"` Uf string `json:"uf" gorm:"column:SG_UF"` Tipo string `json:"tipo" gorm:"column:NOM_ITEM"` Situacao string `json:"situacao" gorm:"column:DESC_SITU"` Depreciacao string `json:"depreciacao" gorm:"column:DEPRECIACAO"` Nbem string `json:"n_bem" gorm:"column:NRO_UNIV"` } func (Os) TableName() string { return "ordensServico" }
修改后的Laudo结构体
type Laudo struct { gorm.Model NumOsID string `json:"num_os"` DataLaudo time.Time `json:"data_laudo"` JustificativaID int `json:"JustificativaID"` Justificativa Justificativa`gorm:"foreignKey:JustificativaID"` FunciAcompanhante string `json:"funci_acompanhante"` SituacaoID int `json:"situacaoID"` Situacao Situacao `gorm:"foreignKey:SituacaoID"` Anexos []Arquivo `json:"anexos"` Os Os `json:"os" gorm:"foreignKey:NumOsID;references:NOs"` // 配置关联规则 }
关联查询示例
现在可通过Preload实现关联查询,直接获取Laudo.Os.Cidade:
var laudo Laudo db.Preload("Os").First(&laudo, "num_os = ?", "目标OS编号") // 访问laudo.Os.Cidade即可获取对应视图数据
内容的提问来源于stack exchange,提问作者Spinassi
相关产品推荐
相关产品推荐

