@VadimRublev
Go, front-end (ванильный).

Как правильно сделать соединение с СУБД «MySQL» в глобальной переменной?

Как правильно сделать соединение с СУБД "MySQL" в глобальной переменной? Чтобы не соединяться с БД в каждом роуте/функции, а просто юзать один объект-соединение.
Понятно, что типа так:
db, err := sql.Open("mysql", "login:password@/nameDB") // Соединились с БД.
if err != nil {
// _обработчик_Ошибки_
return
}
defer db.Close() // Отложенное закрытие соединения-db.

Собственно, вопрос больше про закрытие, выходит...
  • Вопрос задан
  • 207 просмотров
Пригласить эксперта
Ответы на вопрос 1
Можно сделать следующим образом:
в отдельном пакете, пусть это будет database сделать следующее:
package database

import (
	"fmt"
	"github.com/jinzhu/gorm"
	_ "github.com/jinzhu/gorm/dialects/sqlite"
	"log"
	"os"
)

var db *gorm.DB // объявляем переменную для работы с БД

func init() {
	// при обращении к пакету database будет совершена попытка подключения к БД
	conn, err := gorm.Open("sqlite3", "database.db")
	if err != nil {
		log.Println(fmt.Sprintf("database error: %v", err))
	} else {
		log.Println("database connected")
	}
	// записываем результат соединения в ранее объявленную переменную
	db = conn
}

// Создаем глобальную функцию с результатом соединения, чтоб можно было работать с БД из любого пакета
func Connector() *gorm.DB {
	return db
}


Далее в main.go прописать следующее:
package main

import (
	"go-tmp/project/database"
	"log"
)

func main() {
	// объявляем анонимную функцию, которая закроет соединения с БД при завершении работы приложения
	defer func() {
		if err := database.Connector().Close(); err != nil {
			log.Println(err)
		}
	}()
}


Правильнее некуда :)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы