Во многих примерах можно увидеть такой код:
db.Find(&users)
Для небольших проектов это работает. Но в production почти всегда стоит выполнять запросы с context.Context.
Если запрос к базе данных зависнет или окажется слишком долгим, Context позволяет отменить его по таймауту или при завершении HTTP-запроса ✅
🔴 Самый простой вариант — задать таймаут:
ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
defer cancel()
err := db.WithContext(ctx).Find(&users).Error
Если запрос не успеет выполниться за две секунды, драйвер базы данных попытается отменить его, а GORM вернёт ошибку.
🔴 В HTTP-приложениях ещё лучше использовать контекст самого запроса:
func GetUsers(w http.ResponseWriter, r *http.Request) {
var users []User
if err := db.WithContext(r.Context()).Find(&users).Error; err != nil {
// ...
}
}
Если клиент закроет соединение или сервер отменит запрос, операция в базе тоже будет прервана.
Context стоит использовать практически во всех серверных приложениях: HTTP API, gRPC, фоновых задачах и сервисах, работающих с внешними ресурсами ✅ Это позволяет избежать бесконечно выполняющихся запросов и делает приложение устойчивее к сбоям.
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека Go-разработчика
#GoToProduction