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

Golang SQL包中的QueryRow和Exec有什么区别?

Golang SQL包中的QueryRow和Exec有什么区别?

Go
慕田峪9158850 2022-05-18 09:46:00
在 Golang SQL 包中有 QueryRow 和 Exec 用于执行查询。如果我在事务中执行插入查询,在性能方面哪个更好?err = tx.QueryRow(query, params).Scan(&id)对比result, err = tx.Exec(query, params)
查看完整描述

2 回答

?
有只小跳蛙

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

通常用于读取 1 行使用QueryRow()

err := tx.QueryRow(`Select col from t where col=$1`, "val").Scan(&colholder)

用于通过UPDATEDELETE等操作数据INSERT。使用Exec

result, err := tx.Exec(`Delete from t where col=$1`, "val")

如您所见,没有什么可以扫描的,Exec因为那是执行而不是查询。

但是,没有人阻止您QueryRow进行Exec操作,反之亦然,但这不是预期的目的。您可能会失去对每种操作类型的优化。此外,如果你使用QueryRowfor Exec,你会得到sql.ErrNoRows错误,因为没有要返回的行UPDATEINSERT或者DELETE

同样Exec.Scan如果您在Exec.

但是有些情况下使用QueryRowforExec操作

err := tx.QueryRow(`Delete from t where col=$1 returning id`, "val").Scan(&deletedID)

您只需决定是否要从 sql 操作返回值,使用QueryRowelse use Exec

在你的情况下,如果你想在插入操作后使用一些数据,比如 id QueryRow,否则Exec就可以了。


查看完整回答
反对 回复 2022-05-18
?
胡子哥哥

TA贡献1825条经验 获得超6个赞

如果您要插入单行使用QueryRow- 它设计用于最多一次更新。

如果您正在执行具有多个结果的多命令更新/查询,请使用ExecExec行迭代完成后需要关闭行结果。

因此,为了便于使用,如果您知道自己只操作一行,请使用QueryRow.


查看完整回答
反对 回复 2022-05-18
  • 2 回答
  • 0 关注
  • 169 浏览
慕课专栏
更多

添加回答

举报

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