cpp

MySQL. Регистрация драйвера и подключение к базе данных

Итак, прежде чем подключаться к базе данных, необходимо сначала подключить пакет database/sql, а затем зарегистрировать драйвер. Для этого используется следующая инструкция импорта:

import (
   "database/sql"
   "fmt"
   "os"

   _ "github.com/go-sql-driver/mysql" // Регистрация драйвера
)

Вы заметили, как мы подключили пакет github.com/go-sql-driver/mysql? Мы подключили пакет и проигнорировали его, указав в качестве псевдонима символ подчеркивания. При этом внутри программы пакет больше нигде не нужен. Зачем же мы подключали пакет? Дело в том, что при подключении пакета автоматически вызывается функция с названием init(), внутри которой можно выполнить инициализацию пакета, например, присвоить глобальным переменным некоторые значения. Если мы откроем файл C:\Users\<Имя пользователя>\go\pkg\mod\github.com\go-sql-driver\mysql@v1.6.0\driver.go, то сможем найти следующий фрагмент кода:

func init() {
   sql.Register("mysql", &MySQLDriver{})
}

Внутри функции init() вызывается функция Register() из пакета database/sql, которая выполняет регистрацию драйвера. Функциями и методами из пакета database/sql мы в дальнейшем как раз и будем пользоваться в наших программах.

Для выбора драйвера предназначена функция Open() из пакета database/sql. Формат функции:

sql.Open(driverName string, dataSourceName string) (*sql.DB, error)

В первом параметре указывается название драйвера, а во втором параметре — строка с опциями подключения:

[username[:password]@][protocol[(address)]]/dbname[?
param1=value1&...&paramN=valueN]

Функция возвращает два значения. Через первое значение в случае успеха доступен указатель на объект соединения sql.DB. С помощью этого указателя выполняется вся дальнейшая работа с базой данных. Через второе значение доступен объект ошибки или значение nil, если операция выполнена успешно.

После завершения работы с базой данных нужно закрыть соединение с помощью метода Close(). Формат метода:

(*sql.DB).Close() error

Чтобы соединение было обязательно закрыто даже в случае возникновения паники нужно использовать инструкцию defer:

db, err := sql.Open("mysql", "root:@/godb")
if err != nil {
   fmt.Fprintln(os.Stderr, err)
   return
}
defer db.Close()

Значение root означает имя пользователя, а после двоеточия задается его пароль. При использовании XAMPP пользователь root не имеет пароля, поэтому мы указали пустую строку. После слеша задается название базы данных к которой будут выполняться запросы. Мы будем подключаться к базе данных godb, которую создали в разд. 12.6.

Функция Open() не проверяет возможность подключения к базе данных. Поэтому отсутствие ошибки еще не означает, что подключение успешно выполнено. По существу проверяется только существование драйвера с названием из первого параметра. Подключение и проверка соединения выполняется при первом запросе. Для проверки соединения можно использовать метод Ping(). Формат метода:

(*sql.DB).Ping() error

Функция возвращает объект ошибки или значение nil, если операция выполнена успешно. Пример:

fmt.Fprintln(os.Stderr, "Ping()", db.Ping())

Если пользователь не существует, то получим следующее сообщение об ошибке:

Ping() Error 1044: Access denied for user ''@'localhost' to database 
'godb'

Если пароль не подходит, то сообщение об ошибке будет таким:

Ping() Error 1045: Access denied for user 'root'@'localhost' (using 
password: YES)

Если база данных не существует, то получим такое сообщение об ошибке:

Ping() Error 1049: Unknown database 'godb2'

Функцию Open() можно использовать совместно с различными драйверами. Получить слайс со всеми доступными драйверами позволяет функция Drivers(). Формат функции:

sql.Drivers() []string

Пример:

fmt.Println(sql.Drivers()) // [mysql]

Учебник Go (Golang)
Учебник Go (Golang) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов

cpp