«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Должен ли я использовать DB.exec() или подготовленные операторы в Go для запросов без строк результатов?

Должен ли я использовать DB.exec() или подготовленные операторы в Go для запросов без строк результатов?

Опубликовано 23 декабря 2024 г.
Просматривать:758

Should I Use `DB.exec()` or Prepared Statements in Go for Queries Without Result Rows?

Расшифровка загадки использования *DB.exec() и подготовленных операторов в Golang

Введение

В реальной жизни манипулирования базами данных с использованием Go и Postgresql, возникает давний вопрос: зачем вообще DB.exec() или подготовленные операторы, когда Go, похоже, автоматизирует их создание? В этой статье рассматриваются тонкости выполнения операций, которые не возвращают строки, и поясняется обоснование использования подготовленных операторов.

Зачем использовать DB.exec()?

Хотя это правда, что DB.Query() и DB.exec() можно использовать как взаимозаменяемые для выполнения операторов SQL, они различаются по типу возвращаемого результата. DB.exec() предоставляет информацию о количестве строк, затронутых запросом, тогда как DB.Query() возвращает набор результатов.

Например, предположим, вы хотите выполнить инструкцию DELETE и определить количество удаленных строк. Использование DB.exec() является предпочтительным подходом:

res, err := db.Exec(`DELETE FROM my_table WHERE expires_at = $1`, time.Now())
if err != nil {
    panic(err)
}

numDeleted, err := res.RowsAffected()
if err != nil {
    panic(err)
}
print(numDeleted)

В качестве альтернативы, более громоздкий подход предполагает использование DB.Query() и циклическое перебор строк для их подсчета:

rows, err := db.Query(`DELETE FROM my_table WHERE expires_at = $1 RETURNING *`, time.Now())
if err != nil {
    panic(err)
}
defer rows.Close()

var numDeleted int
for rows.Next() {
    numDeleted  = 1
}
if err := rows.Err(); err != nil {
    panic(err)
}
print(numDeleted)

Более того, когда результат запроса не имеет значения и вам просто нужно его выполнить, DB.exec() предлагает краткое решение:

if _, err := db.Exec(``); err != nil {
    panic(err)
}

Напротив, отсутствие вызова закрытия для возвращаемого значения DB.Rows при использовании DB.Query() в конечном итоге приведет к перегрузке открытых соединений из-за утечек памяти.

Углубление подготовленных операторов

Хотя предполагалось, что Go автоматически создает подготовленные заявления, реальность кажется более нюансированной. Поведение DB.Query(), похоже, зависит от используемого базового драйвера.

Тем не менее, подготовка и повторное использование DB.Stmt может повысить производительность часто выполняемых операций. запросы. Взглянув на официальную документацию Postgresql, вы поймете, как подготовленные операторы могут оптимизировать операции.

Заключение

Понимание различий между DB.exec() и подготовленные операторы в Golang помогают разработчикам выполнять операции, которые не возвращают строки эффективно, и использовать преимущества подготовленных операторов при оптимизации производительности.

Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3