Golang gorm 加入第二个 table 数据即将到来
Golang gorm join 2nd table data's now coming
我是 Golang
中的新手,请假设我有 2 个如下所示的模型
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"`
}
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"`
}
这是我的 Database connection
& get jobs
API 代码
package main
import (
"encoding/json"
"fmt"
"net/http"
"strconv"
"time"
"github.com/gorilla/mux"
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/mysql"
)
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"`
}
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"`
}
var db *gorm.DB
func initDB() {
var err error
dataSourceName := "root:@tcp(localhost:3306)/?parseTime=True"
db, err = gorm.Open("mysql", dataSourceName)
if err != nil {
fmt.Println(err)
panic("failed to connect database")
}
//db.Exec("CREATE DATABASE test")
db.LogMode(true)
db.Exec("USE test")
db.AutoMigrate(&Jobs{}, &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
// db.Preload("jobs").Find(&jobs)
// json.NewEncoder(w).Encode(jobs)
var jobs []Jobs
if err := db.Table("jobs").Select("*").Joins("JOIN execution_environments on execution_environments.execution_environment_id = jobs.execution_environment_id").Find(&jobs).Error; err != nil {
fmt.Println(err)
}
json.NewEncoder(w).Encode(jobs)
}
func main() {
// router
router := mux.NewRouter()
// Access URL
router.HandleFunc("/GetAllJobs", GetAllJobs).Methods("GET")
// Initialize db connection
initDB()
// config port
fmt.Printf("Starting server at 8000 \n")
http.ListenAndServe(":8000", router)
}
在 GetAllJobs
中,我尝试获取 jobs
table 数据和 execution_environments
table 数据。但是我的代码没有fetch
execution_environments
table数据。请检查下面的示例 json
:
[
{
"JobID": 4,
"SourcePath": "test1",
"Priority": 2,
"InternalPriority": "test",
"ExecutionEnvironmentID": "103"
}
]
jobs table
execution_environments table
请帮我获取 json
中的 execution_environments
table 数据
Job和ExecutionEnvironment之间的关系是belongs_to吗?
https://gorm.io/docs/belongs_to.html
如果是,只需将 ExecutionEnvironment 添加到您的作业结构中
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 `gorm:"foreignKey:ExecutionEnvironmentID"`
}
并且您应该能够获取 ExecutionEnvironment 数据
如果 Jobs
和 ExecutionEnvironment
之间的关系是一对一的,您的 Jobs
结构可能如下所示:
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 `gorm:"foreignKey:ExecutionEnvironmentID"`
}
接下来,要加载 Jobs
模型中的 ExecutionEnvironment
字段,您需要使用 Preload 函数。
如果您已经定义了两个表之间的关系(外键),您可以像这样获取数据:
var jobs []Jobs
if err := db.Preload("ExecutionEnvironment").Find(&jobs).Error; err != nil {
fmt.Println(err)
}
如果没有,请尝试包含 Joins
函数:
var jobs []Jobs
if err := db.Preload("ExecutionEnvironment").Joins("JOIN execution_environments ee on ee.execution_environment_id = jobs.execution_environment_id").Find(&jobs).Error; err != nil {
fmt.Println(err)
}
我是 Golang
中的新手,请假设我有 2 个如下所示的模型
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"`
}
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"`
}
这是我的 Database connection
& get jobs
API 代码
package main
import (
"encoding/json"
"fmt"
"net/http"
"strconv"
"time"
"github.com/gorilla/mux"
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/mysql"
)
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"`
}
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"`
}
var db *gorm.DB
func initDB() {
var err error
dataSourceName := "root:@tcp(localhost:3306)/?parseTime=True"
db, err = gorm.Open("mysql", dataSourceName)
if err != nil {
fmt.Println(err)
panic("failed to connect database")
}
//db.Exec("CREATE DATABASE test")
db.LogMode(true)
db.Exec("USE test")
db.AutoMigrate(&Jobs{}, &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
// db.Preload("jobs").Find(&jobs)
// json.NewEncoder(w).Encode(jobs)
var jobs []Jobs
if err := db.Table("jobs").Select("*").Joins("JOIN execution_environments on execution_environments.execution_environment_id = jobs.execution_environment_id").Find(&jobs).Error; err != nil {
fmt.Println(err)
}
json.NewEncoder(w).Encode(jobs)
}
func main() {
// router
router := mux.NewRouter()
// Access URL
router.HandleFunc("/GetAllJobs", GetAllJobs).Methods("GET")
// Initialize db connection
initDB()
// config port
fmt.Printf("Starting server at 8000 \n")
http.ListenAndServe(":8000", router)
}
在 GetAllJobs
中,我尝试获取 jobs
table 数据和 execution_environments
table 数据。但是我的代码没有fetch
execution_environments
table数据。请检查下面的示例 json
:
[
{
"JobID": 4,
"SourcePath": "test1",
"Priority": 2,
"InternalPriority": "test",
"ExecutionEnvironmentID": "103"
}
]
jobs table
execution_environments table
请帮我获取 json
execution_environments
table 数据
Job和ExecutionEnvironment之间的关系是belongs_to吗?
https://gorm.io/docs/belongs_to.html
如果是,只需将 ExecutionEnvironment 添加到您的作业结构中
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 `gorm:"foreignKey:ExecutionEnvironmentID"`
}
并且您应该能够获取 ExecutionEnvironment 数据
如果 Jobs
和 ExecutionEnvironment
之间的关系是一对一的,您的 Jobs
结构可能如下所示:
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 `gorm:"foreignKey:ExecutionEnvironmentID"`
}
接下来,要加载 Jobs
模型中的 ExecutionEnvironment
字段,您需要使用 Preload 函数。
如果您已经定义了两个表之间的关系(外键),您可以像这样获取数据:
var jobs []Jobs
if err := db.Preload("ExecutionEnvironment").Find(&jobs).Error; err != nil {
fmt.Println(err)
}
如果没有,请尝试包含 Joins
函数:
var jobs []Jobs
if err := db.Preload("ExecutionEnvironment").Joins("JOIN execution_environments ee on ee.execution_environment_id = jobs.execution_environment_id").Find(&jobs).Error; err != nil {
fmt.Println(err)
}