Миграции. Простые и сложные

В процессе разработки приложения часто возникает необходимость в изменении структуры базы данных. Например, может понадобится создать новую таблицу или столбец. К тому же необходимо отслеживать эти изменения и вести версионный контроль не только кода, но и базы данных(миграции). Особенно важно это, когда над проектом работают несколько разработчиков.

Миграции в Ruxon Framework и Ruxon CMS

Технологическая поддержка миграций в Ruxon Framework развита достаточно широко. Миграции реализованы во всех модулях Ruxon CMS.

Существуют два типа миграций: простые и сложные.

Простые представляют собой массив специального формата, который и описывает необходимые манипуляции с базой данных.

Сложные - класс, наследуемый от класса DbMigration.

Сложные миграции следует использовать тогда, когда функционала простых миграций не достаточно. К примеру, требуется помимо создания структуры, выполнить какие-то манипуляции с данными в таблицах.

Важно: все файлы миграций должны иметь префикс 1_ - где 1 - порядковый номер миграции в пределах модуля.

Простые миграции

Для примера, в директории ruxon/modules/Custom/migrations создадим файл 1_test_table.php со следующим содержимым:

return array (
  'test_table' =>
  array (
    'Fields' =>
    array (
      'id' =>
      array (
        'Type' => 'pk',
      ),
      'date_creation' =>
      array (
        'Type' => 'datetime',
      ),
      'date_modification' =>
      array (
        'Type' => 'datetime',
      ),
      'user_creation_id' =>
      array (
        'Type' => 'int(10) unsigned',
        'Default' => '0',
      ),
      'user_modification_id' =>
      array (
        'Type' => 'int(10) unsigned',
        'Default' => '0',
      ),
      'pos' =>
      array (
        'Type' => 'int(10) unsigned',
        'Default' => '0',
      ),
      'is_active' =>
      array (
        'Type' => 'tinyint(1) unsigned',
        'Default' => '0',
      ),
      'name' =>
      array (
        'Type' => 'varchar(255)',
      ),
    ),
  ),
);

Данный код - простая миграция для создания таблицы test_table с некоторым набором полей.

Рассмотрим пример для изменения структуры таблиц:

return array (
  'test_table' =>
  array (
    'Fields' =>
    array (
      'external_id' =>
      array (
        'Type' => 'varchar(255)',
      ),
    ),    
  ),
);

Данная миграция добавит поле external_id к таблице test_table.

Простые миграции также могут добавлять данные в таблицы:

return array (
  'test_table' =>
  array (
    'Insert' =>
    array (
      =>
      array (
        'name' => 'Первый товар',
        'is_active' => '1',
      ),
    ),
  ),
);

Сложные миграции

Иногда функционала простых миграций недостаточно, тогда на помощь придут миграции сложные.

Например, совсем недавно с помощью сложной миграции мы добавили в каталог товаров возможность указать любое количество категорий и перевели все товары в базе на новую систему.

Вот как выглядит такая миграция:

class CatalogueItemCategoriesMigration extends DbMigration
{
    public $tableName = 'catalogue_item2categories';

    public function up()
    {
        $this->createTable($this->tableName, array(
            'item_id' => array(
                'Type' => 'int(10) unsigned'
            ),

            'category_id' => array(
                'Type' => 'int(10) unsigned'
            ),

            'primary_key' => array(
                'Type' => 'primary_key',
                'Keys'  => array('item_id', 'category_id')
            )
        ));

        /**
         * Fix data for multi-categories system
         */
        Core::import('Modules.Catalogue');

        $items = Manager::getInstance()->getMapper('CatalogueItemMapper')->find();
        foreach ($items as $itm)
        {
            $itm->setCategories(array($itm->getCategoryId()));
            $itm->save();
        }
    }

    public function down()
    {
        $this->dropTable($this->tableName);
    }
}

Как видно из примера, с помощью сложных миграций может быть описана любая логика.

Метод up вызывается для применения миграции.

Метод  down вызывается при откате миграции.

Кстати, оба метода являются безопасными. Т.е. если при выполнении какого либо участка миграции произойдет ошибка, то будет выполнен безопасный откат.

Запуск миграций

При использовании Ruxon Framework для запуска миграции используется консольное приложение.

php console/index.php Main Migration module=Custom

Выполнение данного кода в консоли приведет к применению всех миграций модуля Custom.

Запуск миграций в Ruxon CMS осуществляется в разделе “Модули” административного интерфейса.

Заключение

Вот мы и рассмотрели работу с миграциями. Сложные миграции появятся в версии 7.4, которая выйдет в самом начале апреля.

Читайте также:

Рейтинг

+
0
-




Комментарии к посту "Миграции. Простые и сложные"

Комментариев пока нет.


Комментарии ВКонтакте

Релиз 8.0, всего за 9800 руб.