猿问

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

在 Golang SQL 包中有 QueryRow 和 Exec 用于执行查询。如果我在事务中执行插入查询,在性能方面哪个更好?

err = tx.QueryRow(query, params).Scan(&id)

对比

result, err = tx.Exec(query, params)


慕田峪9158850
浏览 170回答 2
2回答

有只小跳蛙

通常用于读取 1 行使用QueryRow()err := tx.QueryRow(`Select col from t where col=$1`, "val").Scan(&colholder)用于通过UPDATE、DELETE等操作数据INSERT。使用Execresult, err := tx.Exec(`Delete from t where col=$1`, "val")如您所见,没有什么可以扫描的,Exec因为那是执行而不是查询。但是,没有人阻止您QueryRow进行Exec操作,反之亦然,但这不是预期的目的。您可能会失去对每种操作类型的优化。此外,如果你使用QueryRowfor Exec,你会得到sql.ErrNoRows错误,因为没有要返回的行UPDATE,INSERT或者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就可以了。

胡子哥哥

如果您要插入单行使用QueryRow- 它设计用于最多一次更新。如果您正在执行具有多个结果的多命令更新/查询,请使用Exec. Exec行迭代完成后需要关闭行结果。因此,为了便于使用,如果您知道自己只操作一行,请使用QueryRow.
随时随地看视频慕课网APP

相关分类

Go
我要回答