为什么sql.Open()在不应该的时候返回nil为错误?

时间:2015-09-02 05:18:37

标签: mysql go

我正在尝试连接到mysql数据库。

如果我给错了连接信息,我试着看看是否会出错,但它仍然会返回nil错误。即使我完全关闭了mysql,它仍然不会返回错误。如果没有返回错误,在此函数之后检查错误的重点是什么?

这是在Windows上,我使用的是XAMPP,我没有数据库的密码。用户名为"root"

import (
    "database/sql"
    "log"

    _ "github.com/go-sql-driver/mysql"
)

func main() {
    db, err := sql.Open("mysql", "root@tcp(127.0.0.1:3306)/dbname?charset=utf8")
    if err != nil {
        log.Fatal(err)
    }
    defer db.Close()
}

3 个答案:

答案 0 :(得分:4)

SQL.Open仅创建数据库对象,但不会打开与数据库的任何连接。如果要测试连接,则必须执行查询以强制打开连接。常见的方法是在数据库对象上调用Ping()。

请参阅http://golang.org/pkg/database/sql/#Openhttp://golang.org/pkg/database/sql/#DB.Ping

答案 1 :(得分:4)

引自sql.Open()的文件:

  

Open可以仅在不创建与数据库的连接的情况下验证其参数。要验证数据源名称是否有效,请调用Ping。

如上所述,Open()可能无法打开与数据库服务器的任何物理连接,但它将验证其参数。如果参数有效,即使数据库服务器不可访问,或者即使nil表示的主机不存在,也可能返回dataSourceName错误。

回答你的另一个问题:

  

如果此函数没有返回错误,检查错误是什么意思?

您必须检查返回的错误,因为它可以返回错误。例如,如果指定的driverName无效,则返回非零错误(参见下文)。

要测试数据库服务器是否可访问,请使用DB.Ping()。但是如果返回的错误是nil,则只能使用此方法,否则返回的DB也可能是nil(因此调用Ping()方法可能会导致运行时间恐慌):

if db, err := sql.Open("nonexistingdriver", "somesource"); err != nil {
    fmt.Println("Error creating DB:", err)
    fmt.Println("To verify, db is:", db)
} else {
    err = db.Ping()
    if err != nil {
        fmt.Println("db.Ping failed:", err)
    }
}

输出(在Go Playground上尝试):

Error creating DB: sql: unknown driver "nonexistingdriver" (forgotten import?)
To verify, db is: <nil>

答案 2 :(得分:0)

事实证明,这实际上并没有立即连接到数据库。

来源:http://go-database-sql.org/accessing.html

要检查连接的有效性,我们可以这样做:

db, err := sql.Open("mysql", "root@tcp(127.0.0.1:3306)/dbname?charset=utf8")
err = db.Ping() // Need to do this to check that the connection is valid
if err != nil {
    log.Fatal(err)
}