首页 > 后端开发 > Golang > 对于没有结果行的查询,我应该使用'DB.exec()”还是 Go 中的准备语句?

对于没有结果行的查询,我应该使用'DB.exec()”还是 Go 中的准备语句?

Susan Sarandon
发布: 2024-12-12 22:42:30
原创
383 人浏览过

Should I Use `DB.exec()` or Prepared Statements in Go for Queries Without Result Rows?

破译在 Golang 中使用 *DB.exec() 和准备语句的难题

简介

领域中当使用 Go 和 Postgresql 进行数据库操作时,一个挥之不去的问题出现了:为什么要费心DB.exec() 或者当 Go 看起来自动创建它们时准备好的语句?本文深入研究了执行不返回行的操作的复杂性,并阐明了使用准备好的语句背后的基本原理。

为什么使用 DB.exec()

虽然 DB.Query() 确实如此,并且DB.exec() 可以互换使用来执行 SQL 语句,它们的不同之处在于返回的结果类型。 DB.exec() 提供有关受查询影响的行数的见解,而 DB.Query() 返回结果集。

例如,假设您希望执行 DELETE 语句并确定已删除的行数。使用 DB.exec() 是首选方法:

res, err := db.Exec(`DELETE FROM my_table WHERE expires_at = `, time.Now())
if err != nil {
    panic(err)
}

numDeleted, err := res.RowsAffected()
if err != nil {
    panic(err)
}
print(numDeleted)
登录后复制

或者,更麻烦的方法是使用 DB.Query() 并循环rows 来计算它们:

rows, err := db.Query(`DELETE FROM my_table WHERE expires_at =  RETURNING *`, time.Now())
if err != nil {
    panic(err)
}
defer rows.Close()

var numDeleted int
for rows.Next() {
    numDeleted += 1
}
if err := rows.Err(); err != nil {
    panic(err)
}
print(numDeleted)
登录后复制

此外,当查询结果不相关并且你只需要执行它,DB.exec()提供了一个简洁的解决方案:

if _, err := db.Exec(`<my_sql_query>`); err != nil {
    panic(err)
}
登录后复制

相反,在以下情况下省略返回的DB.Rows值的关闭调用:使用 DB.Query() 最终会因内存导致打开连接过载

深入研究准备好的语句

虽然有人建议 Go 自动创建准备好的语句,但现实似乎更加微妙。 DB.Query() 的行为似乎取决于所使用的底层驱动程序。

尽管如此,准备和重用 DB.Stmt 可以提高频繁执行的性能查询。浏览 Postgresql 官方文档,了解准备好的语句如何优化操作。

结论

理解 DB.exec() 和Golang 中的预准备语句可帮助开发人员高效执行不返回行的操作,并在寻求性能优化时利用预准备语句的优势。

以上是对于没有结果行的查询,我应该使用'DB.exec()”还是 Go 中的准备语句?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板