Обычно для чтения 1 строки используйте QueryRow()
err := tx.QueryRow(`Select col from t where col=$1`, "val").Scan(&colholder)
Для манипулирования данными с помощью UPDATE
, DELETE
, INSERT
и * c. Используйте Exec
result, err := tx.Exec(`Delete from t where col=$1`, "val")
Как видите, в Exec
сканировать нечего, потому что это выполнение, а не запрос.
Однако никто не мешает вам QueryRow
для операции Exec
или наоборот, но это не будет предназначением. Вы можете потерять под капотом оптимизацию для каждого типа операции. Также, если вы используете QueryRow
для Exec
, вы получите ошибку sql.ErrNoRows
, потому что в UPDATE
, INSERT
или DELETE
.
нет строки, аналогичной вы не будете возможность получить значение из Exec
, поскольку оно возвращает ответ, который не может быть .Scan
ned, если вы используете операцию запроса в Exec
.
Однако существуют случаи использования QueryRow
для Exec
операции
err := tx.QueryRow(`Delete from t where col=$1 returning id`, "val").Scan(&deletedID)
Вы просто решаете, хотите ли вы возвращаемое значение из операции sql, используйте QueryRow
, в противном случае используйте Exec
.
В вашем случае, если вы хотите вернуть некоторые данные например, id после операции вставки, используйте QueryRow
, в противном случае Exec
подходит просто отлично.