Golang使用GORM查询Jobs时无法获取关联ExecutionEnvironment表数据求助
解决方法
你的问题根源是Jobs结构体没有定义对应的关联字段来存储ExecutionEnvironment表的查询结果,哪怕执行了Join查询,返回的关联字段也没有地方接收,序列化JSON时自然不会包含这部分数据。按照以下步骤修改即可:
1. 调整模型结构体,添加关联配置
修改Jobs结构体,新增关联的ExecutionEnvironment字段,同时配置GORM外键关联标签:
type Jobs struct { JobID uint `json:"jobId" gorm:"primary_key;auto_increment"` SourcePath string `json:"sourcePath"` Priority int64 `json:"priority"` InternalPriority string `json:"internalPriority"` ExecutionEnvironmentID string `json:"executionEnvironmentID"` // 新增关联字段,指定外键和关联表的主键对应关系 ExecutionEnvironment ExecutionEnvironment `json:"executionEnvironment" gorm:"foreignKey:ExecutionEnvironmentID;references:ExecutionEnvironmentId"` } type ExecutionEnvironment struct { ExecutionEnvironmentId string `json:"executionEnvironmentID" gorm:"primary_key;auto_increment"` CloudProviderType string `json:"cloudProviderType"` InfrastructureType string `json:"infrastructureType"` CloudRegion string `json:"cloudRegion"` CreatedAt time.Time `json:"createdAt"` }
注意:原来的结构体标签里
json: "xxx"中间有多余空格,要修正为json:"xxx",否则JSON序列化可能出现字段名不匹配的问题。
2. 修改查询逻辑,使用GORM Preload加载关联数据
不需要手动写Join语句,直接用GORM内置的Preload方法即可自动加载关联的ExecutionEnvironment数据:
func GetAllJobs(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json") fmt.Println("Executing Get All Jobs function") var jobs []Jobs // Preload参数填写关联字段的名称,GORM会自动完成关联查询 if err := db.Preload("ExecutionEnvironment").Find(&jobs).Error; err != nil { fmt.Println(err) http.Error(w, "数据查询失败", http.StatusInternalServerError) return } json.NewEncoder(w).Encode(jobs) }
返回结果示例
修改后接口返回的JSON格式如下:
[ { "jobId": 4, "sourcePath": "test1", "priority": 2, "internalPriority": "test", "executionEnvironmentID": "103", "executionEnvironment": { "executionEnvironmentID": "103", "cloudProviderType": "aws", "infrastructureType": "ecs", "cloudRegion": "us-east-1", "createdAt": "2024-01-01T12:00:00Z" } } ]
内容的提问来源于stack exchange,提问作者Ramesh S
相关产品推荐
相关产品推荐

