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的连接池,并且该状态可能会损坏其他查询(您希望该状态是干净的)