【问题标题】:Golang MySQL Database Not Selected未选择 Golang MySQL 数据库
【发布时间】:2013-11-24 12:36:31
【问题描述】:

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

【问题讨论】:

    标签: mysql database go


    【解决方案1】:

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

    dsn := "user:password@/dbname"
    db, err := sql.Open("mysql", dsn)
    

    【讨论】:

    • 虽然这确实有效,但我不得不问为什么我需要这样做?如果我以后需要更改数据库怎么办?我只需要关闭并打开一个新连接吗?
    • 我也有同样的问题。看来 USE 语句的工作方式有些随机。我在某处读到 SQL 驱动程序缓存多个连接。有没有可能其中一些没有注册 USE 语句?
    【解决方案2】:

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

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

    对于SELECT/UPDATE/INSERT/etc需要在查询中指定DB名。

    【讨论】:

      【解决方案3】:

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

      如果添加子句:

      db.SetMaxOpenConns(1)
      

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

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

      【讨论】:

        猜你喜欢
        • 2017-11-03
        • 2012-12-06
        • 2015-06-13
        • 2012-01-20
        • 2014-05-14
        • 2010-10-25
        • 2014-03-25
        • 2011-02-16
        相关资源
        最近更新 更多