gpt4 book ai didi

mysql - 使用 Golang 将 SQL 查询结果放入嵌套结构中

转载 作者:数据小太阳 更新时间:2023-10-29 03:45:39 24 4
gpt4 key购买 nike

下面是程序的全部代码。它是一种转发请求的服务。正在工作。我想要做的是摆脱当前存储所有配置的 yml 文件并将它们移动到 db。我不想弄乱代码,所以我的想法是将数据库数据简单地存储在相同的结构中。

    // Config contains configuration for this service
type Instance struct {
User string `json:"user"`
Password string `json:"password"`
InstanceId string `json:"instance_id"`
InstanceType string `json:"instance_type"`
InstanceMode string `json:"instance_mode"`
ClientId string `json:"client_id"`
ClientSecret string `json:"client_secret"`
PublicKey string `json:"pubkey"`
Apis Api `json:"apis"`
}

// API struct
type Api struct {
Name string `json:"name"`
Url string `json:"url"`
Version string `json:"version"`
IsBhdGw bool `json:"isBhdGw"`
Key string `json:"key"`
}


// API struc
type InfoResponse struct {
InstanceId string `json:"instance_id"`
InstanceType string `json:"instance_type"`
InstanceMode string `json:"instance_mode"`
ClientId string `json:"client_id"`
ClientSecret string `json:"client_secret"`
PublicKey string `json:"pubkey"`
Apis Api `json:"apis"`
}

type Settings struct {
Port int `json:"port"`
User string `json:"user"`
Secret string `json:"secret"`
Mode string `json:"mode"`
}

type Instances struct {
Instances []Instance
}

var payloadLength int = 3
var instances Instances
var settings Settings
var db *sql.DB



func fetchInstances() []Instance {

rows, err := db.Query("SELECT Instances.InstanceId, Instances.User, Instances.Password, Instances.InstanceType, Instances.InstanceMode, Instances.ClientId, Instances.ClientSecret, Instances.PublicKey, Api.Name, Api.Url, Api.Version, Api.IsBhdGw, Api.Key FROM Instances, Api")

if err != nil {
panic(err.Error())
}

defer rows.Close()

instances := []Instance{}


for rows.Next() {
var instance Instance
var apis Api

err := rows.Scan(&instance.InstanceId, &instance.User, &instance.Password,
&instance.InstanceType, &instance.InstanceMode, &instance.ClientId, &instance.ClientSecret, &instance.PublicKey,
&apis.Name, &apis.Url, &apis.Version, &apis.IsBhdGw, &apis.Key)

if err != nil {
panic(err.Error())
}

instance.Apis = apis

instances = append(instances, instance)
}

return instances
}

当我运行它时,我得到一个“ panic :运行时错误:无效的内存地址或零指针取消引用”

最佳答案

您正在尝试连接到一个未启动的数据库连接。这是由于变量阴影。

虽然你已经定义了一个全局的 db 变量:

var db *sql.DB

您的 main() 方法在连接时创建一个新方法:

db, err := sql.Open(dbDriver, dbUser+":"+dbPass+"@tcp(db:3306)/"+dbName)

因此,当您调用使用全局变量的 fetchInstances 时,全局变量仍未设置。

最简单的解决方案是更改 main() 中的代码,如下所示:

var err error
db, err = sql.Open(dbDriver, dbUser+":"+dbPass+"@tcp(db:3306)/"+dbName)

但更好的解决方案是永远不要使用全局变量。在 main 中使用本地定义的变量,然后将其传递给 fetchInstances


作为旁注:始终,始终检查您的错误。在您的代码中,您两次未能检查数据库连接错误,如:

db, err := sql.Open(dbDriver, dbUser+":"+dbPass+"@tcp(db:3306)/"+dbName)
err = db.Ping()

if err != nil {
fmt.Println(err)
os.Exit(1)
}

如果连接失败,您的 db.Ping() 调用可能会崩溃。相反,您应该这样做:

db, err := sql.Open(dbDriver, dbUser+":"+dbPass+"@tcp(db:3306)/"+dbName)
if err != nil {
fmt.Println(err)
os.Exit(1)
}

err = db.Ping()

if err != nil {
fmt.Println(err)
os.Exit(1)
}

关于mysql - 使用 Golang 将 SQL 查询结果放入嵌套结构中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50180231/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com