Mysql 读取sql.Rows.Next()时,执行另一个查询返回错误:1046未选择数据库

Mysql 读取sql.Rows.Next()时,执行另一个查询返回错误:1046未选择数据库,mysql,go,Mysql,Go,(错误检查和一些细节省略) 安装程序 我是这样打开数据库的: d, err = sql.Open("mysql", "user:passwd@tcp(127.0.0.1:3306)/") _, err = d.Exec("CREATE DATABASE IF NOT EXISTS myblog") _, err = d.Exec("USE myblog") 但如果我改成这个,一切都很好: d, err = sql.Open("mysql", "user:passwd@tcp(127.0.0.1

(错误检查和一些细节省略)

安装程序 我是这样打开数据库的:

d, err = sql.Open("mysql", "user:passwd@tcp(127.0.0.1:3306)/")
_, err = d.Exec("CREATE DATABASE IF NOT EXISTS myblog")
_, err = d.Exec("USE myblog")
但如果我改成这个,一切都很好:

d, err = sql.Open("mysql", "user:passwd@tcp(127.0.0.1:3306)/myblog")
执行 我有两张桌子:

articles
ID, ArticleID, Title, CreateDate, PreviewContent, Content, PRIMARY KEY (ID)

categories
ArticleID, CategoryName, PRIMARY KEY (ArticleID, CategoryName)
在一个函数中,我从
文章
中选择了10行:

selectAtcs := `
    SELECT ArticleID, Title, CreateDate, PreviewContent
    FROM articles 
    ORDER BY ID DESC
    LIMIT ?
    OFFSET ?`

var rows *sql.Rows
rows, err = db.DB.Query(selectAtcs, 10, 0)
在阅读每一个文档时,我执行了另一个查询,以获取与
ArticleID
相关的类别:

for rows.Next() {
    var a Article
    err = rows.Scan(&a.ArticleID, &a.Title, &a.CreateDate, &a.PreviewContent)

    selectCtg := `
        SELECT CategoryName
        FROM categories 
        WHERE ArticleID = ?`

    var ctgRows *sql.Rows
    ctgRows, err = db.DB.Query(selectCtg, a.ArticleID)
}

上述代码的最后一行返回错误:
1046未选择任何数据库

sql.DB不是到数据库的单个连接,而是连接池,因此不能保证在后续查询中使用相同的连接(除非在事务中执行)

发件人:

DB是一个数据库句柄,表示零个或多个底层数据库的池 连接。多个goroutine同时使用它是安全的

sql包自动创建和释放连接;它也 维护空闲连接的空闲池。如果数据库具有>一个 对于每个连接状态的概念,这样的状态只能是可靠的 在事务中观察到的

另一个警告-如果您在某个连接上运行更改连接状态的查询(例如,直接运行SQL语句,如
USE
BEGIN
,等等),则该连接将返回到用于连接到DB的连接池,并且该状态可能会损坏其他查询(您希望该状态是干净的)