我正在使用github.com/go-sql-driver/mysql
包来连接MySQL。除非我选择数据库(USE
),否则它无法运行查询。
package main
import (
"database/sql"
"fmt"
"log"
)
import _ "github.com/go-sql-driver/mysql"
func main() {
dsn := "root:@/"
db, err := sql.Open("mysql", dsn)
if err != nil {
fmt.Println("Failed to prepare connection to database. DSN:", dsn)
log.Fatal("Error:", err.Error())
}
err = db.Ping()
if err != nil {
fmt.Println("Failed to establish connection to database. DSN:", dsn)
log.Fatal("Error:", err.Error())
}
_, err = db.Query("USE test")
if err != nil {
fmt.Println("Failed to change database.")
log.Fatal("Error:", err.Error())
}
_, err = db.Query("SHOW TABLES")
if err != nil {
fmt.Println("Failed to execute query.")
log.Fatal("Error:", err.Error())
}
}
该程序产生此输出:
Error 1046: No database selected
答案 0 :(得分:3)
直接在sql.Open函数的DSN(数据源名称)部分指定数据库:
dsn := "user:password@/dbname"
db, err := sql.Open("mysql", dsn)
答案 1 :(得分:0)
您需要使用交易记录:
tx, _ := db.Begin()
tx.Query("USE test")
tx.Query("SHOW TABLES")
tx.Commit()
对于 SELECT / UPDATE / INSERT / etc ,需要在查询中指定数据库名称。
答案 2 :(得分:0)
那是因为db维护了一个连接池,该连接池具有与mysql数据库的多个连接。“ USE test”仅允许一个连接使用架构测试。 稍后在执行数据库查询时,驱动程序将选择一个空闲连接,如果选择了使用测试模式的连接,则该连接正常,但是如果选择了另一个连接,则该连接不使用测试,因此将报告错误:未选择数据库。
如果添加子句:
db.SetMaxOpenConns(1)
数据库仅维护一个连接,不会有错误。当然,在高并发场景中这是不可能的。
如果在sql.open()函数中指定数据库名称,则所有连接都将使用该数据库,从而可以避免此问题。