简介
领域中当使用 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中文网其他相关文章!