我正在尝试连接到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()
}
答案 0 :(得分:4)
SQL.Open仅创建数据库对象,但不会打开与数据库的任何连接。如果要测试连接,则必须执行查询以强制打开连接。常见的方法是在数据库对象上调用Ping()。
请参阅http://golang.org/pkg/database/sql/#Open和http://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)
}