Использование баз данных в 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 довольно просто вытекает из контекста и может быть использовано там, где это необходимо.

Надеюсь, статья была полезной для вас!

+1
1
+1
0
+1
0
+1
0
+1
0

Ответить

Ваш адрес email не будет опубликован. Обязательные поля помечены *