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

What are the differences between QueryRow and Exec in Golang SQL package?

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

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

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

如果您要插入单行,请使用 QueryRow - 它最多只能更新一行。

如果您执行多命令 updates/queries 并产生多个结果,请使用 Exec。来自 Exec 的行结果需要在行迭代完成后关闭。

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

一般读取 1 行使用 QueryRow()

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

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

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

如您所见,Exec 中没有任何可扫描的内容,因为那是执行而不是查询。

然而,没有人会阻止您 QueryRow 进行 Exec 操作,反之亦然,但这不是预期目的。您可能会失去每种操作的底层优化。 此外,如果您将 QueryRow 用于 Exec,您将收到 sql.ErrNoRows 错误,因为 UPDATEINSERT 或 return 中没有行=15=].

同样,如果您在 [=17= 中使用查询操作,您将无法从 Exec 中获取值,因为它 return 的响应无法 .Scanned ].

但是有些情况下 QueryRow 用于 Exec 操作

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

您只需决定是否要从 sql 操作中获得 return 值,使用 QueryRow 否则使用 Exec.

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