简介
领域中使用 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 = $1`, time.Now()) if err != nil { panic(err) } numDeleted, err := res.RowsAffected() if err != nil { panic(err) } print(numDeleted)
或者,更麻烦的方法是使用 DB.Query() 并循环遍历行来对它们进行计数:
rows, err := db.Query(`DELETE FROM my_table WHERE expires_at = $1 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(``); err != nil { panic(err) }
相反,在使用 DB.Query() 时忽略返回的 DB.Rows 值的关闭调用最终将导致打开连接过载由于内存泄漏。
深入研究准备好的语句
虽然有人建议Go 自动创建准备好的语句,现实情况似乎更加微妙。 DB.Query() 的行为似乎取决于所使用的底层驱动程序。
然而,准备和重用 DB.Stmt 可以提高频繁执行的性能查询。浏览 Postgresql 官方文档,了解准备好的语句如何优化操作。
结论
理解 DB.exec() 和Golang 中的预准备语句可帮助开发人员执行不会有效返回行的操作,并在寻求性能优化时利用预准备语句的优势。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3