2

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

4

3 回答 3

7

直接在 sql.Open 函数的 DSN(Data Source Name)部分指定数据库:

dsn := "user:password@/dbname"
db, err := sql.Open("mysql", dsn)
于 2013-11-12T11:45:17.263 回答
1

在您的情况下,您需要使用交易:

tx, _ := db.Begin()
tx.Query("USE test")
tx.Query("SHOW TABLES")
tx.Commit()

对于SELECT/UPDATE/INSERT/etc需要在查询中指定数据库名称。

于 2019-02-15T17:57:09.660 回答
0

那是因为 db 维护了一个连接池,该连接池与 mysql 数据库有多个连接。“USE test”只是让一个连接使用 schema 测试。后面查询数据库时,驱动会选择一个空闲的连接,如果选择了使用test schema的连接正常,但是如果选择了另一个连接,则不使用test,所以会报错:未选择数据库。

如果添加子句:

db.SetMaxOpenConns(1)

db只会保持一个连接,不会出错。当然在高并发场景下也不可能。

如果你在 sql.open() 函数中指定数据库名称,所有的连接都会使用这个数据库,可以避免这个问题。

于 2019-06-25T13:58:30.950 回答