Часть 5: Подготовка базы данных, миграции (Тестирование ПО)
Оглавление
Перед вами очередная часть цикла Тестирование ПО. В предыдущей части мы развернули инфраструктуру для работы с проектом на базе Yii2-advanced-template. В этой части мы разберемся как работать с базой данных и что такое миграции.
База данных
Подготовка машины
Нам потребуется две базы данных. Одну из них мы создали на предыдущем этапе разработки. Вторую добавим сейчас. Поскольку правилом хорошего тона считается наличие отдельной базы данных для запуска тестов. Это правило позволяет достичь повторяемости результатов при непрерывном прогоне кейсов..
Можно это сделать руками, но проще всего отредактировать конфигурацию config.yaml. Добавим в секции mariadb.databases и mariadb.grants две записи. Одна из них - описание базы. Вторая - права доступа на новую базу.
mariadb:
...
databases:
...
mariadbnd_r4j5mttm7uht:
name: tdd_tests
sql: ''
grants:
...
mariadbng_puym1vumdrfg:
user: tdd
table: 'tdd_tests.*'
privileges:
- ALL
Теперь можно запустить провизию машины заново. Либо из командной строки, либо из меню PHPStorm (Tools->Vagrant->Provision). Через некоторое время, которое зависит от производительности вашей машины, вы увидите сообщение об успешном завершении команды.
Как проверить, что все нормально работает? Нужно зайти в систему по ssh. Сделать это можно двумя способами: при помощи команды vagrant ssh в консоли или при помощи меню PHPStorm (Tools->Start ssh session и в открывшемся окне стоит выбрать vagrant как объект для подключения). Затем подключаемся к консоли mariadb (mysql -u root -p) и вводим команду show databases.
Структура базы
Далее потребуется спроектировать схему таблицы user таким образом, чтобы она поддерживала все необходимые базовые возможности по работе с пользователям в yii2. Особо усердствовать на этом этапе мы не будем, а возьмем рекомендованную схему из фреймворка.
Для того, чтобы создать таблицу выше нам потребуется написать миграцию yii2 (конечно писать мы пока ничего не будем, а возьмем готовый файл, который любезно предоставили нам разработчики advanced template). Но прежде - отредактировать конфигурационные файлы, которые содержат DSN-строки подключения. Это файлы main-local.php и test-local.php из каталога environments/dev/common/config.
Требуется поменять соответствующие строки таким образом чтобы они указывали на актуальную базу разработчика и на тестовую базу соответственно.
main-local.php
'db' => [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=localhost;dbname=tdd',
'username' => 'root',
'password' => 'tdd',
'charset' => 'utf8',
]
test-local.php
'db' => [
'dsn' => 'mysql:host=localhost;dbname=tdd_tests',
]
Развертывание конфигурации
Теперь необходимо полученную конфигурацию развернуть. Сделать это можно несколькими способами:
- вручную скопировать отредактированные файлы в каталог common/config
- запустить провизию машины заново (Эта операция помимо прочего еще и скопирует конфигурационные файлы в нужное место.)
- зайти по ssh на машину и запустить скрипт init.php с нужными параметрами (php init –env=${YII_ENV} –overwrite=y)
Выберите удобный для себя способ и разверните новую конфигурацию.
Миграции
Раньше разработчикам приходилось держать схему базы данных отдельно от проекта и по мере надобности вручную вносить изменения. Это довольно однообразный процесс на каждом этапе которого был велик риск получить расхождения схемы в базе и схемы в системе контроля версий.
Теперь необходимость в этом отпала и большинство современных фреймворков работают с так называемыми миграциями схемы базы данных. Yii2 исключением не является и поддерживает этот механизм.
Создание миграции
Для создания миграции существует консольная команда
yii migrate/create <имя миграции>
Разработчики шаблона заботливо создали за нас первую миграцию init которая расположена она в файле console/migrations/m130524_201442_init.php.
Все хорошо, но есть одно но - данный код предназначен для большинства имеющихся баз и поэтому задуман быть универсальным. У нас же четко определено с какой базой требуется работать. Поэтому нелишним будет изменить ряд столбцов под конкретные цели.
- username для нас не имеет особого значения и он не обязательно должен быть уникальным (во многих проектах его оставляют уникальным и это очень мешает пользователям когда все ники уже заняты)
- created_at - это timestamp с дефолтным значением равным CURRENT_TIMESTAMP
- updated_at - это тоже timestamp со значением CURRENT_TIMESTAMP которое обновляется при каждом обновлении записи
$this->createTable('', [
'id' => $this->primaryKey(),
'username' => $this->string()->notNull(),
'auth_key' => $this->string(32)->notNull(),
'password_hash' => $this->string()->notNull(),
'password_reset_token' => $this->string()->unique(),
'email' => $this->string()->notNull()->unique(),
'status' => $this->smallInteger()->notNull()->defaultValue(10),
'created_at' => 'timestamp DEFAULT current_timestamp',
'updated_at' => 'timestamp DEFAULT current_timestamp ON UPDATE current_timestamp',
], $tableOptions);
$this->addCommentOnTable('', 'User table');
Кратко пройдемся по некоторым моментам
- означает имя таблицы user с добавлением префикса таблиц из конфигурационного файла
- created_at и update_at используют нативный формат записи типа поля поскольку на данный момент SchemaBuilder не очень дружит с полями timestamp и вообще с датой-временем.
- Всегда добавляйте комментарии на таблицы и поля. Это поможет вам ориентироваться в схеме при разрастании проекта.
Применение миграции
Для применения конкретной миграции (или всех) требуется зайти на виртуальную машину в каталог с проектом (/var/www в нашем случае) и выполнить команду
php yii migrate/up
Система спросит вас о том, действительно ли вы хотите применить миграцию. Отвечаете утвердительно и через некоторое время вам будет показано сообщение об успешном применении нового кода.
Посмотреть что получилось можно зайдя в консоль mysql и выполнив запрос на отображение схемы таблицы.
mysql -u tdd -p tdd
И сам запрос.
show create table user;
В ответ мы увидим актуальную структуру таблицы user.
Автоматизация
Чтобы каждый раз не задумываться о том, запустили мы миграции или нет стоит это дело отдать на откуп скриптам. Можно использовать секциями composer.json post-update-cmd и post-install-cmd, что мы и сделаем.
"scripts": {
...
"post-update-cmd": [
"php yii migrate --interactive=0"
],
"post-install-cmd": [
"php yii migrate --interactive=0"
]
}
Теперь при выполнении провизии помимо установки зависимостей будут применены изменения к базе данных.
Литература
- “Разработка веб-приложений в Yii 2” Марк Сафронов, ISBN: 978-5-97060-252-2
- Yii2 Application Development Cookbook
Исходный код
Категории: Разработка HowTo