Сейчас наша база данных настроена и установлен драйвер для работы с MySQL из Golang, теперь можно попробовать подключиться к базе данных из веб-приложения.

Содержание статьи

Для создания пула соединений, нам потребуется функция sql.Open(), которая используется следующим образом:

Премиум 👑 курс по Golang

Рекомендуем вам супер курс по Golang где собраны все материалы для качественного изучения языка. Удивите всех своими знаниями на собеседовании! 😎

Записаться на курс

Уроки, статьи и Видео

Мы публикуем в паблике ВК и Telegram качественные обучающие материалы для быстрого изучения Go. Подпишитесь на нас в ВК и в Telegram. Поддержите сообщество Go программистов.

Go в ВК Go в Telegram

В этом коде есть несколько моментов, которые следует разобрать:

  • Первый параметр из sql.Open() представляет собой название драйвера (в нашем случае это mysql), а второй параметр — название источника данных (иногда он еще называется строкой подключения или DSN), которое описывает, как подключиться к базе данных;
  • Формат названия источника данных будет зависеть от того, какую базу данных и драйвер вы используете. Как правило, эту информацию можно найти в документации к вашему конкретному драйверу. Документацию по нашему MySQL-драйверу можно найти здесь;
  • Часть с parseTime=true в приведенном выше DSN представляет собой специфичный для драйвера параметр, который указывает драйверу, что нужно преобразовывать SQL поля TIME и DATE в Go объекты time.Time;
  • Функция sql.Open() возвращает объект sql.DB. Это не соединение с базой данных — это пул множества соединений. Это важное различие нужно запомнить. Go управляет этими подключениями по мере необходимости, автоматически открывая и закрывая подключения к базе данных через драйвер;
  • Пул соединений безопасен для конкурентного доступа, поэтому его можно спокойно использовать из обработчиков маршрутов веб-приложений;
  • Пул соединений рассчитан на долгий срок службы. В веб-приложении, пул соединений обычно инициализируется в функции main(), а затем этот пул передается обработчикам. Не нужно вызывать sql.Open() в каждом обработчике — это будет пустой тратой памяти и сетевых ресурсов.

Использование пула подключений в веб-приложении на Go

Разберем использование sql.Open() на практике. Откройте файл main.go и добавьте в него следующий код:

В этом коде есть несколько интересных моментов:

  • Обратите внимание, что в пути импорта mysql-драйвера есть префикс подчеркивания _. Причина в том, что файл main.go ничего не использует из пакета mysql. Если мы попытаемся импортировать его в обычном режиме без подчеркивания, то компилятор выдаст ошибку. Во время импорта mysql-драйвера, он в фоновом режиме выполнит функцию init(), которая необходима для дальнейшей работы с пакетом database/sql. Смысл такого трюка состоит в том, чтобы связать название пакета с пустым идентификатором. Это стандартная практика для большинства SQL драйверов в Go;
  • Функция sql.Open() не создает никаких подключений к базе данных. Все, что она делает, это инициализирует пул подключений для использования в будущем. Фактические подключения к базе данных устанавливаются лениво, если это впервые. Чтобы убедиться, что все настроено правильно, нужно использовать метод db.Ping() для создания соединения с MySQL и проверки на наличие ошибок;
  • На данный момент вызов defer db.Close() является излишним. Наше приложение завершается только от ручной комбинации на клавиатуре (то есть Ctrl+C) или фатальной ошибки которая автоматически вызовет errorLog.Fatal(). В обоих случаях программа немедленно завершает работу, а отложенные функции никогда не будут запущены. Но использование db.Close() по завершению работы с базой данных, будет считаться хорошим тоном, и такой подход будет полезен в будущем, если вы добавите в свое приложение аккуратное завершение работы при возникновении фатальных ошибок.

Тестирование подключения к MySQL из веб-приложения

Убедитесь, что все отредактированные файлы сохранены. Затем попробуйте запустить наше веб-приложение из терминала. Если всё прошло по плану, пул подключений должен быть установлен, а метод db.Ping() попробует подключится к базе данных без каких-либо ошибок. Если все в порядке, вы должны увидеть обычное сообщение из логов: Запуск сервера на… 

Если приложение не запускается или появляется сообщение об ошибке "Access denied...", как показано ниже, то проблема скорее всего связана с вашей строкой подключения (DSN). Проверьте правильность имени пользователя и пароля, разрешения пользователей и что ваш  MySQL сервер использует стандартные настройки.

Но, скорее всего вы неправильно указали логин или пароль от MySQL пользователя, пройдите еще раз прошлый урок по настройки базы данных.

Скачать исходный код

В конце каждой статьи мы предоставляем вам готовый архив с кодом для запуска веб-приложения на текущем этапе курса.

Скачать: snippetbox-17.zip