在全局变量中存储数据库连接

时间:2015-04-05 22:29:12

标签: go

我在这里提供了Golang的MySQL驱动程序

https://github.com/go-sql-driver/mysql

我要做的其中一件事是将数据库变量存储在全局连接中。根据文档,sql.Open()应该返回一个指向DB结构的指针,所以我尝试将其存储为

var db *DB

然而,这导致了错误

undefined: DB

我接下来要做的就是查看MySQL驱动程序的源代码,我在这里找到了一段代码https://github.com/go-sql-driver/mysql/blob/master/driver.go

func (d MySQLDriver) Open(dsn string) (driver.Conn, error) {

所以,我试图将变量保存为driver.Conn - 但是,我无法(不正确的导入)。我也无法导入驱动程序。

我尝试的最后一件事是使用反射将变量的名称变为浅色

package main

    import (
        "fmt"
        "reflect"
)

import "database/sql"
import _ "github.com/go-sql-driver/mysql"

func main() {
        db, _ := sql.Open("mysql", "root:password@/Tracker")
        yt := reflect.TypeOf(db).Kind()
        fmt.Printf("%T: %s\n", yt, yt)
}

不幸的是,这也不起作用 - 它显示为指针,而不是它实际指向的变量类型。

我现在不知道如何解决这个问题。在此先感谢您的帮助!

1 个答案:

答案 0 :(得分:25)

您需要使用包名称限定类型的名称:

import(
    "database/sql"
    "github.com/go-sql-driver/mysql"
)

var db *sql.DB // Note the sql package provides the namespace

func main() {
    var err error
    // Make sure not to shadow your global - just assign with = - don't initialise a new variable and assign with :=
    db, err = sql.Open(...)
    if err != nil {
        // Handle the error!
    }

 }

您是否希望拥有全局(易于上手)或明确传递它取决于您,但我建议您暂时保持简单。如果这是进入Web应用程序,您可以安全地跨处理程序/请求共享*sql.DB连接池。