Хранение соединения с базой данных в глобальной переменной

Я использую драйвер MySQL для Golang, представленный здесь

https://github.com/go-sql-driver/mysql

Одна из вещей, которую я пытаюсь сделать, - сохранить переменную базы данных в глобальном соединении. Согласно документации, sql.Open() должен возвращать указатель на структуру базы данных, поэтому я попытался сохранить ее как

var db *DB

Однако это привело к ошибке

undefined: DB

Следующее, что я пробовал, - это посмотреть исходный код для драйвера MySQL, и я нашел фрагмент кода здесь https://github.com/go-sql-driver/mysql/blob/master/driver.go

func (d MySQLDriver) Open(dsn string) (driver.Conn, error) {

Итак, я попытался сохранить переменную как driver.Conn - однако мне не удалось (неправильный импорт). Я также не смог импортировать драйвер.

Последнее, что я попробовал, - использовать рефлекс, чтобы принести имя переменной в свет.

package main

    import (
        "fmt"
        "reflect"
)

import "database/sql"
import _ "github.com/go-sql-driver/mysql"

func main() {
        db, _ := sql.Open("mysql", "root:[email protected]/Tracker")
        yt := reflect.TypeOf(db).Kind()
        fmt.Printf("%T: %s\n", yt, yt)
}

К сожалению, это тоже не сработало - оно отображается как указатель, а не тип переменной, на которую он фактически указывает.

Я не понимаю, как это понять сейчас. Заранее благодарим за помощь!

Ответ 1

Вам нужно определить имя типа с именем пакета:

import(
    "database/sql"
    "github.com/go-sql-driver/mysql"
)

var db *sql.DB // Note the sql package provides the namespace

func main() {
    var err error
    // Make sure not to shadow your global - just assign with = - don't initialise a new variable and assign with :=
    db, err = sql.Open(...)
    if err != nil {
        // Handle the error!
    }

 }

Если вы хотите иметь глобальный (легко начать) или передавать его явно, зависит от вас, но я бы предложил просто сохранить его простым. Если это входит в веб-приложение, вы можете безопасно обмениваться пулом соединений *sql.DB между обработчиками/запросами.