От автора: разрабатывая веб-приложения, так или иначе, Вы работаете с кодом и формируете логику. При этом на определенных этапах, структура приложения может меняться. То есть, что то будет добавлено, что то удалено, что то оптимизировано и т.д. И это нормально для процесса разработки. Но согласитесь, если изменения затрагивают код, то они, так же, могут коснуться и структуры базы данных, опять же создание новых таблиц, добавление необходимых полей и т.д. Поэтому в данном уроке мы поговорим о таком понятии как миграции базы данных и рассмотрим специальную библиотеку, благодаря которой мы с легкостью сможем управлять миграциями.
Для начала хотел бы отметить ,что миграция— обновление структуры базы данных от одной версии до другой (обычно более новой). При этом Вы должны понимать, что миграция не предусматривает перенос базы данных из одной системы управления базами данных в другую. Миграция – это изменение элементов входящих в структуру базы данных – то есть таблиц. К примеру, создание и удаление таблиц, добавление новых полей, редактирование существующих и т.д.
Соответственно, под версией понимается состояние структуры базы данных на определенный момент времени. К примеру, создание таблицы – версия 1. Создание следующей таблицы – версия 2. Добавление полей в первую таблицу – версия 3 и т.д. Таким образом, миграции реализуют контроль версий применительно к базам данных.
Конечно контроль версий баз данных, да и в принципе кода приложения, более актуален в том случае, когда разработка ведется командой разработчиков. Но все же, начинающим веб мастерам полезно знать, что это такое.
Поэтому сегодня я хотел бы представить Вашему вниманию библиотеку Phinx — то есть готовую систему миграций, для баз данных, которую Вы можете использовать в своих проектах.
Начнем, конечно же, с установки библиотеки, а значит переходим на официальный сайт разработчиков.
Далее, кликая по кнопке “INSTALLNOW…” Вы увидите инструкции по установке данной библиотеки. Я буду выполнять установку с использованием инструмента composer, потому как он поставляется вместе с интерпретатором языка PHP, в программном обеспечении OpenSrver, которое я использую.
Соответственно открываем консоль OpenServer, переходим в каталог с разрабатываемым веб-приложением и выполняем следующие команды:
1 2 |
composer require robmorgan/phinx composer install --no-dev |
После выполнения данных команд, библиотека Phinx будет установлена в Вашем проекте. Далее, нужно сформировать конфигурационный файл с расширением .yml, в котором будут содержаться основные настройки необходимые для работы системы миграций.
1 |
php vendor/robmorgan/phinx/bin/phinx init |
Таким образом, вышеуказанная команда, создаст специальный файл phinx.yml в корне проекта, который мы открываем в текстовом редакторе.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
paths: migrations: %%PHINX_CONFIG_DIR%%/migrations seeds: %%PHINX_CONFIG_DIR%%/seeds environments: default_migration_table: phinxlog default_database: development production: adapter: mysql host: localhost name: production_db user: root pass: '' port: 3306 charset: utf8 development: adapter: mysql host: localhost name: phinx_db user: root pass: '' port: 3306 charset: utf8 testing: adapter: mysql host: localhost name: testing_db user: root pass: '' port: 3306 charset: utf8 |
Итак, параметры migrations и seeds – определяют пути для хранения классов миграций и классов добавления начальной информации в таблицы, соответственно.
Параметр default_migration_table – задает название создаваемой таблицы в базе данных, которая необходима для хранения различной системной информации.
Среда разработки, то есть определенный набор настроек, задан в настройке default_database. При этом для каждой среды разработки предусмотрены различные настройки подключения к базе данных. Поэтому выберите для себя интересующую среду и добавьте настройки.
adapter – драйвер подключения;
host – сервер базы данных;
name – имя базы данных;
user – имя пользователя;
pass – пароль пользователя;
port – порт подключения;
charset – кодировка.
Завершив настройку, мы можем создать первую миграцию, а значит выполним следующую команду в консоли.
1 |
phpvendor/robmorgan/phinx/bin/phinxcreateCreateTableArticles |
Обратите внимание, команда create, создает класс новой миграции, имя которого указывается перед командой через пробел. Соответственно класс новой миграции будет создан в каталоге, имя которого указывалось в настройках в параметре migrations.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
<?php use Phinx\Migration\AbstractMigration; class CreateTableArticles extends AbstractMigration { /** * Change Method. * * Write your reversible migrations using this method. * * More information on writing migrations is available here: * //docs.phinx.org/en/latest/migrations.html#the-abstractmigration-class * * The following commands can be used in this method and Phinx will * automatically reverse them when rolling back: * * createTable * renameTable * addColumn * renameColumn * addIndex * addForeignKey * * Remember to call "create()" or "update()" and NOT "save()" when working * with the Table class. */ public function change() { } } |
Как Вы видите – миграция это обычный класс PHP, в котором по умолчанию прописан метод change(), реализующий обратимые миграции. То есть миграция при запуске, так или иначе выполняет некоторое действие, к примеру добавление новых полей в определенную таблицу базы данных. Но особенность миграций заключается в том, что Вы всегда можете отменить действие выполняемое миграцией, то есть осуществить откат. Поэтому действия, которые будут описаны в методе change() – выполняются при запуске миграции и соответственно отменяются при откате.
Помимо выше указанного метода, Вы можете создать в классе миграции, два дополнительных метода: up() и down(). При запуске миграции – вызывается на исполнение метод up(), при откате – down(). Заметьте, что Phinx, игнорирует два выше указанных метода, в том случае, когда описан метод change().
Как видно из названия класса, новая миграция должна создать таблицу Articles в базе данных, а значит, мы должны добавить специальный код в метод change(), который и реализует данное действие.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<?php use Phinx\Migration\AbstractMigration; class CreateTableArticles extends AbstractMigration { public function change() { $articles = $this->table('articles');//id $articles->addColumn('title','string',array('limit'=>150)) ->addColumn('alias', 'string', array('limit'=>200)) ->addColumn('text', 'text') ->addColumn('view', 'integer', array('default'=>10, 'null'=>TRUE)) ->addColumn('home', 'enum', array('values'=>array('yes', 'no'))) ->addColumn('date', 'timestamp', array('default'=>'CURRENT_TIMESTAMP')) ->addIndex(array('title', 'alias'), array('unique'=>TRUE)) ->create();s3 } } |
Для начала необходимо указать с какой таблицей мы будем работать, используя метод table(). В качестве первого аргумента передается имя таблицы, в нашем случае “articles”. При этом вышеуказанный метод вернет объект представляющий данную таблицу, а значит далее мы можем использовать методы, которые будут формировать структуру будущей таблицы. В частности метод addColumn() – добавляет новый элемент, то есть новое поле таблицы. Обратите внимание, что в качестве параметров необходимо указать имя создаваемого поля, тип данных, которые будет хранить поле и последний необязательный аргумент – атрибуты поля в виде массива.
Полный список поддерживаемых полей Вы можете увидеть в официальной документации по библиотеке, или в видео версии данного урока.
Завершающий метод цепочки – create(), который указывает библиотеке, что необходимо создать новую таблицу. Создав класс миграции, его нужно запустить в работу, для этого необходимо выполнить следующую команду.
1 |
phpvendor/robmorgan/phinx/bin/phinxmigrate |
Если в классе миграции, код описан верно – в базе данных будет создана таблица с набором полей описанных с использованием метода addColumn(). Для отмены действий, выполненных классом миграции, необходимо осуществить откат:
1 |
phpvendor/robmorgan/phinx/bin/phinxrollback |
Таким образом, Вы отмените все действия описанные в методе change();
Собственно на этом данный урок я буду завершать. Более расширенную версию, Вы можете увидеть в видео уроке, где мы рассмотрели вопросы удаления и редактирования таблиц, а так же научились добавлять начальную информацию в таблицы, то есть осуществлять так называемый посев данных.
Всего Вам доброго и удачного кодирования!!!
Комментарии (1)