【发布时间】:2019-09-06 07:32:55
【问题描述】:
我正在尝试从数据库加载一个庞大的数据集。
func main() {
db, err := sql.Open("mysql", "root:pass1@tcp(127.0.0.1:3306)/tuts")
if err != nil {
log.Print(err.Error())
}
defer db.Close()
results, err := db.Query("SELECT id, name FROM tags")
if err != nil {
panic(err.Error())
}
for results.Next() {
var tag Tag
err = results.Scan(&tag.ID, &tag.Name)
if err != nil {
panic(err.Error())
}
log.Printf(tag.Name)
}
}
程序是否一次性将所有记录加载到内存中?或者有没有办法指定提取大小,以便程序一次只加载 n 行?假设数据库中有百万行,我想每次获取 1000 条记录。
【问题讨论】:
-
select count(*) from tags怎么样?然后SELECT id, name FROM tags LIMIT 100。 guru99.com/sqlite-query.html#4 -
不,它不会将所有内容加载到内存中。它在调用 Next() 时根据需要获取数据。
-
@RickyA 是的,我们可以编写自定义逻辑。但我想知道是否有标准库中的选项。
-
@Peter 是否对数百万行匹配行的数据库进行了数百万次调用?
-
您也应该添加
defer results.Close(),并且您可以在循环外声明var tag Tag,并在循环内重复使用相同的变量
标签: go go-sqlite3