为了账号安全,请及时绑定邮箱和手机立即绑定

在 Go 中关闭数据库连接的更好/更短的方法

在 Go 中关闭数据库连接的更好/更短的方法

Go
慕姐8265434 2021-09-13 10:03:40
通常我写这样的东西rows := db.MyPgConn.QueryRows(`SELECT * FROM bla`) // or any other queryfor rows.Next() { // if there are result   // rows.Scan(    // do custom operation}rows.Close() // close recordset但是那样的话,我有可能忘记写rows.Close()这样的代码,这可能会使可用连接/套接字的数量耗尽,有没有更好的方法来做到这一点?
查看完整描述

2 回答

?
回首忆惘然

TA贡献1847条经验 获得超11个赞

Godefer正是为此目的而引入的。


rows := db.MyPgConn.QueryRows(`SELECT * FROM bla`) // or any other query

defer rows.Close()


for rows.Next() { // if there are result

   // rows.Scan( 

   // do custom operation

}

从文档:


推迟对诸如此类的函数的调用Close有两个优点。首先,它保证您永远不会忘记关闭文件,如果您稍后编辑该函数以添加新的返回路径,则很容易犯这个错误。其次,这意味着收盘价位于开盘价附近,这比将其放在函数的末尾要清晰得多。


查看完整回答
反对 回复 2021-09-13
?
拉丁的传说

TA贡献1789条经验 获得超8个赞

正如 Internet 所提到的, defer 语句是使 close 语句更接近行 var 声明位置的最佳方式。我能想到的唯一方法是在您的数据库调用周围创建一个包装函数。


func performQuery(q string, op func(db.rows)) {

    rows := db.MyPg.Conn.QueryRows(q)

    // defer rows.Close()

    op(rows)

    rows.Close()

}


// then we could do:

performQuery(`SELECT * FROM bla`,func(rows db.Rows) {

  for rows.Next() {

    // rows.Scan(      

  }

})

但是,这会限制您使用参数进行查询(例如SELECT * FROM tableName WHERE id = $1.


查看完整回答
反对 回复 2021-09-13
  • 2 回答
  • 0 关注
  • 154 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信