在 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)
用于通过UPDATE
、DELETE
等操作数据INSERT
。使用Exec
result, err := tx.Exec(`Delete from t where col=$1`, "val")
如您所见,没有什么可以扫描的,Exec
因为那是执行而不是查询。
但是,没有人阻止您QueryRow
进行Exec
操作,反之亦然,但这不是预期的目的。您可能会失去对每种操作类型的优化。此外,如果你使用QueryRow
for Exec
,你会得到sql.ErrNoRows
错误,因为没有要返回的行UPDATE
,INSERT
或者DELETE
。
同样Exec
,.Scan
如果您在Exec
.
但是有些情况下使用QueryRow
forExec
操作
err := tx.QueryRow(`Delete from t where col=$1 returning id`, "val").Scan(&deletedID)
您只需决定是否要从 sql 操作返回值,使用QueryRow
else use Exec
。
在你的情况下,如果你想在插入操作后使用一些数据,比如 id QueryRow
,否则Exec
就可以了。
胡子哥哥
TA贡献1825条经验 获得超6个赞
如果您要插入单行使用QueryRow
- 它设计用于最多一次更新。
如果您正在执行具有多个结果的多命令更新/查询,请使用Exec
. Exec
行迭代完成后需要关闭行结果。
因此,为了便于使用,如果您知道自己只操作一行,请使用QueryRow
.
- 2 回答
- 0 关注
- 169 浏览
添加回答
举报
0/150
提交
取消