我应该多久在我的程序中调用 sql.Open ?

Dat*_*sik 5 go

正如标题所说,我不知道有多条sql.Open语句是好事还是坏事,或者我是否应该有一个只有 init 的文件,例如:

var db *sql.DB


func init() {
    var err error
    db, err = sql.Open
}
Run Code Online (Sandbox Code Playgroud)

只是想知道最佳做法是什么。谢谢!

Von*_*onC 6

您至少应该检查错误。
如“连接到数据库”中所述:

请注意,Open不会直接打开数据库连接:这会推迟到进行查询时。要在进行查询之前验证是否可以建立连接,请使用以下Ping函数:

if err := db.Ping(); err != nil {
  log.Fatal(err)
}
Run Code Online (Sandbox Code Playgroud)

使用后,使用 Close 关闭数据库。

如果可能,将打开的数据库连接数限制为最少。
参见“ Go/Golang sql.DB 在函数中的重用”:

您不需要到处打开数据库连接。
该database/sql包在内部进行连接池,根据需要打开和关闭连接,同时提供可以同时使用的单个连接的错觉。

正如elithrar在评论中指出的那样,database.sql/#Open确实提到:

返回的数据库对于多个 goroutine 并发使用是安全的,并维护自己的空闲连接池。
因此,该Open函数应该只调用一次。
很少需要关闭数据库。

正如这里提到的

*sql.DB全局声明还有一些额外的好处,例如SetMaxIdleConns(调节连接池大小)或准备跨应用程序的 SQL 语句。

你可以使用一个函数init,即使你没有它也会运行main():

var db *sql.DB
func init() {
    db, err = sql.Open(DBparms....)
}
Run Code Online (Sandbox Code Playgroud)

init()总是被调用,不管有没有 main,所以如果你导入一个有 init 函数的包,它就会被执行。每个包
可以有多个init()函数,它们将按照它们在代码中显示的顺序执行(当然是在所有变量都初始化之后)。