【问题标题】:Why does sql.Open() return nil as error when it should not?为什么 sql.Open() 不应该返回 nil 作为错误?
【发布时间】:2015-09-02 05:18:36
【问题描述】:

我正在尝试连接到 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()
}

【问题讨论】:

    标签: mysql go


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      引用sql.Open()的文档:

      Open 可能只是验证其参数而不创建与数据库的连接。要验证数据源名称是否有效,请调用 Ping。

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

      回答你的其他问题:

      如果这个函数不返回错误,那么在这个函数之后检查错误有什么意义呢?

      您必须检查返回的错误,因为它可以返回错误。例如,如果指定的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>
      

      【讨论】:

        【解决方案3】:

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

        来源: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)
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-11-05
          • 1970-01-01
          • 1970-01-01
          • 2014-11-11
          • 2021-12-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多