Использование баз данных в Golang
Привет всем! В этой статье мы поговорим о том, как мы обрабатываем процессы работы с базами данных в Golang. Хотя операции с базами данных обычно не рассматриваются, использование баз данных в живых проектах может быть довольно дорогостоящим. Соединения с базой данных остаются открытыми после завершения процессов и т.д. – это один из самых важных факторов, увеличивающих затраты.
В этом эссе приведем пример использования db-соединения в middleware.
В проекте:
- Gin-Gonic для Web Framework
- PostgreSQL для базы данных
- Jinzhu/gorm как библиотека манипулирования БД используется.
После установки общего маршрутизатора:
func main() {
r := Routers.Router()
r.Run(":8001")
}
Давайте перейдем на страницу нашего маршрутизатора и сделаем некоторые обновления.
На этой странице мы установим наше подключение к БД в контексте через промежуточное ПО и постараемся закрыть подключение к БД после завершения запроса.
Давайте сделаем это!
Вот пример кода:
func DatabaseMiddleware() gin.HandlerFunc {
return func(c *gin.Context) {
// DB Credentials
db, err := gorm.Open("postgres", "host=localhost user=postgres password=postgres dbname=postgres port=5432 sslmode=disable")
if err != nil {
log.Fatal(err)
}
// Set DB to Context
c.Set("DB", db)
c.Next()
// DB Close When Request is done
defer db.Close()
}
}
Если мы объясним код здесь, то на первом этапе мы устанавливаем соединение с нашими учетными данными базы данных PostgreSQL.
После обработки ситуации ошибки мы устанавливаем соединение с нашим контекстом с помощью ключевого слова “DB”.
Затем мы передаем процесс на следующий этап с помощью функции c.Next().
Функция defer db.Close() играет здесь самую важную роль. Благодаря функции defer после ответа на запрос соединение с базой данных закрывается с помощью функции db.Close().
Таким образом, прекращается загромождение кода и предотвращается ненужное превышение времени соединения.
Включение промежуточного ПО в маршрутизаторы:
func Router() *gin.Engine {
// Define new Gin Connection Router
r := gin.New()
// Use DatabaseMiddleware on new router
r.Use(DatabaseMiddleware())
// Necessary Endpoints
// ...
// ...
// Run Router on Port :8001
log.Fatal(r.Run(":8001"))
return r
}
Таким образом, соединение с БД будет устанавливаться при всех запросах, и соединение с БД будет закрываться после ответов на запросы.
Как же будет использоваться в коде сохраненная в этом Контексте БД?
Давайте посмотрим на пример:
func Create(ctx *gin.Context) {
// Getting DB from Context
db := ctx.MustGet("DB").(*gorm.DB)
// Some necessary codes
// ...
// db usage in function
result, err := process.Create(db)
if err != nil {
helpers.RespondJSON(ctx, false, err.Error(), nil)
return
}
helpers.RespondJSON(ctx, true, "Success", &result)
}
Как видно из приведенного здесь примера, использование db довольно просто вытекает из контекста и может быть использовано там, где это необходимо.
Надеюсь, статья была полезной для вас!