为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕无忌1623718 2023-06-01 15:04:17
我现在的作品有问题。我使用 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将不胜感激
查看完整描述

1 回答

?
红颜莎娜

TA贡献1842条经验 获得超12个赞

首先,如果你想从另一个包中访问某些东西,它必须被导出。在 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: 不推荐使用全局变量传递数据库连接。


查看完整回答
反对 回复 2023-06-01
  • 1 回答
  • 0 关注
  • 119 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信