Введение
В реальной жизни манипулирования базами данных с использованием 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