gpt4 book ai didi

mysql - 在读取 sql.Rows.Next() 执行另一个查询时返回错误 : 1046 no database selected

转载 作者:IT王子 更新时间:2023-10-29 01:23:07 27 4
gpt4 key购买 nike

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

设置

我是这样打开数据库的:

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)

在一个函数中,我从 articles 中选择了 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 no database selected

最佳答案

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

来自 documentation :

DB is a database handle representing a pool of zero or more underlying connections. It's safe for concurrent use by multiple goroutines.

The sql package creates and frees connections automatically; it also maintains a free pool of idle connections. If the database has >a concept of per-connection state, such state can only be reliably observed within a transaction

另一个警告词——您在其上运行更改连接状态的查询的连接(例如,直接运行 USE <db_name>BEGIN 等 SQL 语句)将返回到使用的连接池连接到数据库,并且此状态可能会破坏其他查询(您希望状态是干净的)。

关于mysql - 在读取 sql.Rows.Next() 执行另一个查询时返回错误 : 1046 no database selected,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51241616/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com