Чтобы наше веб-приложение приносило пользу, введенные пользователями данные требуется где-то хранить, а также иметь возможность динамически запрашивать данные хранилища при запросе этих самых данных.
Содержание статьи
- Установка MySQL для Golang
- Создание базы данных в MySQL
- Создание нового пользователя в MySQL
- Тестирование нового пользователя базы данных
Существует много разных хранилищ данных, которые можно использовать для нашего приложения — каждое со своими достоинствами и недостатками. Мы используем популярную реляционную базу данных MySQL.
Рекомендуем вам супер TELEGRAM канал по Golang где собраны все материалы для качественного изучения языка. Удивите всех своими знаниями на собеседовании! 😎
Мы публикуем в паблике ВК и Telegram качественные обучающие материалы для быстрого изучения Go. Подпишитесь на нас в ВК и в Telegram. Поддержите сообщество Go программистов.
В следующем уроке вы узнаете как:
- Подключиться к MySQL из веб-приложения (в частности, вы узнаете, как создать пул повторно используемых подключений);
- Создать независимый пакет
models
, чтобы логику базы данных можно было повторно использовать и изолировать от веб-приложения; - Использовать соответствующие функции из пакета Go
database/sql
для применения различных SQL запросов и как избежать распространенных ошибок, которые могут привести к нехватке ресурсов на вашем сервере; - Предотвратить атаки SQL-инъекций, правильно используя параметры плейсхолдера и фильтрации данных от пользователей;
- Использовать транзакции, чтобы можно было выполнять несколько SQL-операторов за одно атомарное действие.
Установка MySQL для Golang
Для дальнейшей работы нам требуется установить MySQL на компьютер. Официальная документация MySQL содержит подробную инструкцию по установке для всех типов операционных систем. Если вы используете Mac OS, то установить MySQL можно следующим образом:
1 |
$ brew install mysql |
Если вы используете Linux дистрибутив, который поддерживает apt
(как Debian или Ubuntu), установка MySQL производится следующим образом:
1 |
$ sudo apt install mysql-server |
При установке MySQL вас могут попросить указать пароль для пользователя root
. Не забудьте об этом, так как пароль будет важен для следующего шага.
Создание базы данных в MySQL
После успешной установки MySQL к ней можно подключиться через терминал используя данные от root
пользователя. Используемая для этого команда зависит от установленной версии MySQL. С MySQL 5.7 можно попробовать подключиться к MySQK через следующую команду:
1 2 |
$ sudo mysql mysql> |
Но если это не сработает, попробуйте следующую команду и введите пароль, который вы указали при установке.
1 2 3 |
$ mysql -u root -p Enter password: mysql> |
После подключения, требуется создать новую базу данных в MySQL для хранения всех данных от нашего сайта. Скопируйте и вставьте следующие команды в терминале от mysql, чтобы создать новую базу данных snippetbox
с использованием UTF-8 кодировки.
1 2 3 4 5 |
-- Создание новой UTF-8 базы данных `snippetbox` CREATE DATABASE snippetbox CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- Переключение на использование базы данных `snippetbox` USE snippetbox; |
Затем скопируйте ниже предоставленный SQL-запрос для создания новой таблицы snippets
, в которой будут храниться текстовые заметки нашего приложения.
1 2 3 4 5 6 7 8 9 10 11 |
-- Создание таблицы `snippets` CREATE TABLE snippets ( id INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT, title VARCHAR(100) NOT NULL, content TEXT NOT NULL, created DATETIME NOT NULL, expires DATETIME NOT NULL ); -- Добавление индекса для созданного столбца CREATE INDEX idx_snippets_created ON snippets(created); |
У каждой записи в таблице будет столбик id
поле с данными типа integer, которые будут действовать как уникальный идентификатор для каждой заметки. В ней также будет короткое текстовое поле title
(заголовок) и поле content
для хранения текста самой заметки. Метаданные о времени создания заметки будут храниться в поле created
, а срок жизни заметки будет храниться в поле expires
.
Давайте добавим несколько записей в таблицу snippets
(которую мы будем использовать в следующих нескольких уроках). Мы будем использовать несколько коротких пословиц в качестве содержания текстовых заметок, но на самом деле здесь контент не имеет значения.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
-- Добавляем несколько тестовых записей INSERT INTO snippets (title, content, created, expires) VALUES ( 'Не имей сто рублей', 'Не имей сто рублей,\nа имей сто друзей.', UTC_TIMESTAMP(), DATE_ADD(UTC_TIMESTAMP(), INTERVAL 365 DAY) ); INSERT INTO snippets (title, content, created, expires) VALUES ( 'Лучше один раз увидеть', 'Лучше один раз увидеть,\nчем сто раз услышать.', UTC_TIMESTAMP(), DATE_ADD(UTC_TIMESTAMP(), INTERVAL 365 DAY) ); INSERT INTO snippets (title, content, created, expires) VALUES ( 'Не откладывай на завтра', 'Не откладывай на завтра,\nчто можешь сделать сегодня.', UTC_TIMESTAMP(), DATE_ADD(UTC_TIMESTAMP(), INTERVAL 7 DAY) ); |
Создание нового пользователя в MySQL
С точки зрения безопасности не рекомендуется подключаться к MySQL через root
пользователя из веб-приложения. Будет лучше создать пользователя для базы данных с ограниченными правами доступа.
Пока вы все еще подключены к командной строки от MySQL, выполните следующие команды для создания нового web
пользователя с привилегиями выполнения SELECT
и INSERT
запросов только для его базы данных.
1 2 3 4 5 |
CREATE USER 'web'@'localhost'; GRANT SELECT, INSERT, UPDATE ON snippetbox.* TO 'web'@'localhost'; -- Важно: Не забудьте заменить 'pass' на свой пароль, иначе это и будет паролем. ALTER USER 'web'@'localhost' IDENTIFIED BY 'pass'; |
После этого выполните в командной строке exit
для выхода из MySQL.
Тестирование нового пользователя базы данных
Теперь у вас должно получиться соединиться с базой данных snippetbox
через пользователя web
, используя следующую команду. Затем вводится указанный вами пароль.
1 2 3 |
$ mysql -D snippetbox -u web -p Enter password: mysql> |
Если привилегии пользователя работают правильно, вы сможете выполнять операции SELECT
и INSERT
над базой данных, но другие команды, такие как DROP TABLE
и GRANT
, приведут к ошибке.
1 2 3 4 5 6 7 8 9 10 11 |
mysql> SELECT id, title, expires FROM snippets; +----+---------------------------------------------+---------------------+ | id | title | expires | +----+---------------------------------------------+---------------------+ | 1 | Не имей сто рублей | 2022-01-27 13:09:34 | | 2 | Лучше один раз увидеть | 2022-01-27 13:09:40 | | 3 | Не откладывай на завтра | 2021-02-03 13:09:44 | +----+---------------------------------------------+---------------------+ mysql> DROP TABLE snippets; ERROR 1142 (42000): DROP command denied to user 'web'@'localhost' for table 'snippets' |
Скачать исходный код + MySQL дамп
В архивами с исходным кодом появилась новая папка SQL
которая содержит дамп (резервная копия) нашей базы данных snippetbox.sql
. Если вдруг, у вас появились какие либо проблемы с выполнением SQL запросов, или вы начали курс с этой статьи, то можете загрузить дамп snippetbox.sql
в вашу базу данных и всё будет работать.
Скачать: snippetbox-15.zip
Администрирую данный сайт с целью распространения как можно большего объема обучающего материала для языка программирования Go. В IT с 2008 года, с тех пор изучаю и применяю интересующие меня технологии. Проявляю огромный интерес к машинному обучению и анализу данных.
E-mail: vasile.buldumac@ati.utm.md
Образование
Технический Университет Молдовы (utm.md), Факультет Вычислительной Техники, Информатики и Микроэлектроники
- 2014 — 2018 Universitatea Tehnică a Moldovei, ИТ-Инженер. Тема дипломной работы «Автоматизация покупки и продажи криптовалюты используя технический анализ»
- 2018 — 2020 Universitatea Tehnică a Moldovei, Магистр, Магистерская диссертация «Идентификация человека в киберпространстве по фотографии лица»