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

时间:2019-01-14 08:52:57

标签: go beego

我目前的作品有麻烦。我使用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

我该如何解决?

任何帮助都会感激

1 个答案:

答案 0 :(得分:2)

首先,如果要访问另一个包中的内容,则必须将其导出。在Go中,如果要导出某些内容,则将其首字母大写命名(在您的情况下,应为Conn而不是conn)。

第二,当您使用defer时,它将在函数返回时执行。对于您来说,它会立即返回,因此连接会立即关闭。

解决方案:

var Conn *sql.DB
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)
}

现在在您的主包装中:

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: 不建议使用全局变量传递数据库连接。如果您想了解更多信息,请查看:https://www.alexedwards.net/blog/organising-database-access