我们在Golang中是否也应该关闭DB的.Prepare()方法?

huangapple go评论90阅读模式
英文:

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())
}

huangapple
  • 本文由 发表于 2014年12月4日 14:47:50
  • 转载请务必保留本文链接:https://go.coder-hub.com/27287894.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定