英文:
Should we also close DB's .Prepare() in Golang?
问题
从这个教程中可以看出,在stmt.Query()中使用的rows必须调用rows.Close(),那么在db.Prepare()中使用的stmt是否也应该调用stmt.Close()呢?
// 在一个函数内部
stmt, err := db.Prepare(cmd) // cmd 是 SQL 字符串
Check(err)
// 是否应该添加:defer stmt.Close()
rows, err := stmt.Query(params) // params 是 map/interface{}
defer rows.Close()
Check(err)
根据教程的示例,我们可以看到在stmt.Query()之后使用了defer rows.Close()来确保在函数返回之前关闭rows。同样的逻辑也适用于stmt,所以你可以在stmt之后添加defer stmt.Close()来确保在函数返回之前关闭`stmt。
英文:
From this tutorial shown that rows.Closed() must be called where rows is from stmt.Query(), is stmt.Closed() also should be called where stmt is from db.Prepare()?
// inside a function
stmt, err := db.Prepare(cmd) // cmd is SQL string
Check(err)
// should we add: defer stmt.Close()
rows, err := stmt.Query(params) // params is map/interface{}
defer rows.Close()
Check(err)
答案1
得分: 5
翻译结果:
简短的回答是:是的,你应该调用stmt.Close()。
详细的回答可以在这个 Google Groups 的帖子中找到。
英文:
The short answer is Yes. You should call stmt.Close();
The long answer can be found in this google groups thread.
答案2
得分: 0
使用方法如下:
// 在一个函数内部
stmt, err := db.Prepare(cmd) // cmd 是 SQL 字符串
if err != nil {
println(err.Error())
}
defer stmt.Close()
rows, err := stmt.Query(params) // params 是 map/interface{}
if err != nil {
println(err.Error())
}
英文:
Use as follows
// inside a function
stmt, err := db.Prepare(cmd) // cmd is SQL string
if err != nil {
println(err.Error())
}
defer stmt.Close()
rows, err := stmt.Query(params) // params is map/interface{}
if err != nil {
println(err.Error())
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论