未选择Golang MySQL数据库

时间:2013-11-12 11:26:04

标签: mysql database go

我正在使用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

3 个答案:

答案 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()函数中指定数据库名称,则所有连接都将使用该数据库,从而可以避免此问题。