猿问

如何将连接参数 db 传递给 main.go?

我现在的作品有问题。我使用 beego 框架构建了一个应用程序,我是 golang 的新手。


首先,我构建了另一个名为 utils 的包,然后我从该包中编写了一些代码来访问我的数据库


func InitFirebird() {

    var (

        dbDriver   = beego.AppConfig.String("DB_CONNECTION")

        dbUsername = beego.AppConfig.String("DB_USERNAME")

        dbPassword = beego.AppConfig.String("DB_PASSWORD")

        dbServer   = beego.AppConfig.String("DB_HOST")

        // dbPort     = beego.AppConfig.String("DB_PORT")

        dbFileName = beego.AppConfig.String("DB_DATABASE")

    )

    conn, _ := sql.Open(dbDriver, dbUsername+":"+dbPassword+"@"+dbServer+"/"+dbFileName)

    defer conn.Close()

}

之后,我转到我的 main.go 并像这样设置我的 init 函数和 main 函数:


func init() {

    utils.InitFirebird()

}


func main() {

    if beego.BConfig.RunMode == "dev" {

        beego.BConfig.WebConfig.DirectoryIndex = true

        beego.BConfig.WebConfig.StaticDir["/swagger"] = "swagger"

        }


    var n int


    conn.QueryRow("SELECT Count(*) FROM rdb$relations").Scan(&n)

    fmt.Println("Relations count=", n)


    beego.Run()

}

当我重新启动我的应用程序时,出现错误并向我提供此消息:


\main.go:23:2: undefined: conn


我该如何解决这个问题?


Anyhelp将不胜感激


慕无忌1623718
浏览 120回答 1
1回答

红颜莎娜

首先,如果你想从另一个包中访问某些东西,它必须被导出。在 Go 中,如果你想导出一些东西,你可以用首字母大写来命名它(在你的例子中,它应该Conn代替conn)。其次,当你使用它时,defer它会在函数返回时被执行。在您的情况下,它会立即返回,因此连接会立即关闭。解决方案:var Conn *sql.DBfunc InitFirebird() {    var (        dbDriver   = beego.AppConfig.String("DB_CONNECTION")        dbUsername = beego.AppConfig.String("DB_USERNAME")        dbPassword = beego.AppConfig.String("DB_PASSWORD")        dbServer   = beego.AppConfig.String("DB_HOST")        // dbPort     = beego.AppConfig.String("DB_PORT")        dbFileName = beego.AppConfig.String("DB_DATABASE")    )    Conn, _ = sql.Open(dbDriver, dbUsername+":"+dbPassword+"@"+dbServer+"/"+dbFileName)}现在在你的主包中:func init() {    utils.InitFirebird()}func main() {    if beego.BConfig.RunMode == "dev" {        beego.BConfig.WebConfig.DirectoryIndex = true        beego.BConfig.WebConfig.StaticDir["/swagger"] = "swagger"        }    var n int    defer utils.Conn.Close() // <-- Close here    utils.Conn.QueryRow("SELECT Count(*) FROM rdb$relations").Scan(&n)    fmt.Println("Relations count=", n)    beego.Run()}这里Close()不会立即执行,因为beego.Run()会阻塞。PS: 不推荐使用全局变量传递数据库连接。
随时随地看视频慕课网APP

相关分类

Go
我要回答