英文:
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())
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论