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)
用于通过 UPDATE
、DELETE
、INSERT
等操作数据。使用 Exec
result, err := tx.Exec(`Delete from t where col=`, "val")
如您所见,Exec
中没有任何可扫描的内容,因为那是执行而不是查询。
然而,没有人会阻止您 QueryRow
进行 Exec
操作,反之亦然,但这不是预期目的。您可能会失去每种操作的底层优化。
此外,如果您将 QueryRow
用于 Exec
,您将收到 sql.ErrNoRows
错误,因为 UPDATE
、INSERT
或 return 中没有行=15=].
同样,如果您在 [=17= 中使用查询操作,您将无法从 Exec
中获取值,因为它 return 的响应无法 .Scan
ned ].
但是有些情况下 QueryRow
用于 Exec
操作
err := tx.QueryRow(`Delete from t where col= returning id`, "val").Scan(&deletedID)
您只需决定是否要从 sql 操作中获得 return 值,使用 QueryRow
否则使用 Exec
.
在你的情况下,如果你想在插入操作后返回一些数据,比如 id,请使用 QueryRow
,否则 Exec
就可以了。
在 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)
用于通过 UPDATE
、DELETE
、INSERT
等操作数据。使用 Exec
result, err := tx.Exec(`Delete from t where col=`, "val")
如您所见,Exec
中没有任何可扫描的内容,因为那是执行而不是查询。
然而,没有人会阻止您 QueryRow
进行 Exec
操作,反之亦然,但这不是预期目的。您可能会失去每种操作的底层优化。
此外,如果您将 QueryRow
用于 Exec
,您将收到 sql.ErrNoRows
错误,因为 UPDATE
、INSERT
或 return 中没有行=15=].
同样,如果您在 [=17= 中使用查询操作,您将无法从 Exec
中获取值,因为它 return 的响应无法 .Scan
ned ].
但是有些情况下 QueryRow
用于 Exec
操作
err := tx.QueryRow(`Delete from t where col= returning id`, "val").Scan(&deletedID)
您只需决定是否要从 sql 操作中获得 return 值,使用 QueryRow
否则使用 Exec
.
在你的情况下,如果你想在插入操作后返回一些数据,比如 id,请使用 QueryRow
,否则 Exec
就可以了。