Каковы различия между QueryRow и Exe c в пакете Golang SQL? - PullRequest
1 голос
/ 12 февраля 2020

В пакете Golang SQL есть QueryRow и Exe c для выполнения запроса. Если я выполняю запрос вставки внутри транзакции, что лучше использовать с точки зрения производительности?

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

против

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

Ответы [ 2 ]

3 голосов
/ 12 февраля 2020

Если вы вставляете одну строку, используйте QueryRow - она ​​рассчитана максимум на одно обновление строки.

Если вы выполняете многокомандные обновления / запросы с несколькими результатами, используйте Exec. Строка с результатами Exec должна быть закрыта после завершения итерации строки.

Так что для простоты использования, и если вы знаете, что манипулируете только одной строкой, go с QueryRow.

1 голос
/ 12 февраля 2020

Обычно для чтения 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 подходит просто отлично.

...