如何将连接参数 db 传递给 main.go?
How can I pass connection parameter db to 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
我该如何解决?
任何帮助将不胜感激
首先,如果您想从另一个包中访问某些内容,则必须将其导出。在 Go 中,如果你想导出一些东西,你可以用首字母大写来命名它(在你的例子中,它应该是 Conn
而不是 conn
)。
其次,当你使用defer
时,它会在函数returns时被执行。在您的情况下,它会立即 returns,因此连接会立即关闭。
解法:
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
我目前的作品有问题。我使用 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
我该如何解决?
任何帮助将不胜感激
首先,如果您想从另一个包中访问某些内容,则必须将其导出。在 Go 中,如果你想导出一些东西,你可以用首字母大写来命名它(在你的例子中,它应该是 Conn
而不是 conn
)。
其次,当你使用defer
时,它会在函数returns时被执行。在您的情况下,它会立即 returns,因此连接会立即关闭。
解法:
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