Миграции в Yii: пошаговая инструкция

13 октября, 2014
Метки:

Миграции — это незаменимый инструмент при совместной работе над проектом. Каждый разработчик меняет что-то в структуре БД. Остальным приходится делать те-же изменения в своей локальной базе. Какие изменения нужно внести? Какие изменения я уже применял в своей базе? Где найти изменения, что сделал в структуре БД другой программист? Всю головную боль на себя возьмет механизм миграций. А пользоваться им проще простого. Главное чтобы все разработчики, участвующие в проекте пользовались им.

  • Шаг 1: настраиваем коннект к БД — миграции будут запускаться из консоли, поэтому нужно настроить protected/config/console.php , прописав там коннект к базе в настройках компонента db
    'components'=>array(
    		'db'=>array(
    			'connectionString' => 'mysql:host=localhost;dbname=mydb',
    			'emulatePrepare' => true,
    			'username' => 'myuser',
    			'password' => 'mypass',
    			'charset' => 'utf8',
    		),
    

    На мой взгляд то, что для миграций и приложения можно использовать разный коннект — просто замечательная идея! Можно разделить права пользователей для доступа к базе и только от имени пользователя, прописанного в консольном коннекте разрешать изменения в структуре БД. Это в какой-то мере защитит базу в случаи несанкционированного доступа из приложения.

  • Шаг 2: создаем файл миграции. Удостоверьтесь в том, что у вас существует папка protected/migrations и она доступна для записи. Перейдите в консоли в папку protected и запустите команду
    php yiic migrate create <name>
    

    yiic — это исполняемый файл в папке protected. Вместо «name» нужно написать имя для своей миграции. Выбирайте имя, говорящее о том, что именно произойдет в миграции. Например «create_my_table» или «add_name_in_user_table». Разрешенными символами для имени миграции являются латинские буквы и знак подчеркивания. В случаи успешного выполнения команды в папке protected/migrations появится новый файл. Добавляем его в систему контроля версий, чтобы остальные разработчики тоже его получили.

  • Шаг 3: действия в миграции. После прошлого шага у вас в папке protected/migrations появится класс вроде этого:
    Class m141013_082754_my_migrate extends CDbMigration
    {
    	public function up()
    	{
    	}
    
    	public function down()
    	{
    		echo "m141013_082754_my_migrate does not support migration down.\n";
    		return false;
    	}
    }
    

    В классе миграции существует два основных метода: up — выполняется при применении миграции, а down — в случаи отката. Если откат не возможет, метод down должен вернуть false
    Пишем в данном классе, те действия по изменению БД, которые мы хотели сделать. Доступные методы: execute, insert, update, delete, createTable, renameTable, dropTable, truncateTable, addColumn, dropColumn, renameColumn, createIndex и другие можно посмотреть в классе CDbMigration.

    public function up()
    	{
            $this->createTable('orders', array(
                'id'           => 'pk',
                'user_id'      => 'integer unsigned NOT NULL',
                'order_number' => 'string',
                'summa'        => 'money',
                'status'       => 'integer',
                'date_create'  => 'datetime',
                'last_status_change'=> 'datetime',
            ));
    	}
    
    	public function down()
    	{
            $this->dropTable('orders');
    		return true;
    	}
    

    Думаю вы заметили, что описание типов данных столбцов отличается от стандарта SQL. Это сделано для того, чтобы механизм миграций мог работать на различных типах баз данных. В Yii доступны следующие типы столбцов таблицы:

    	'pk' => 'int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY',
    	'string' => 'varchar(255)',
    	'text' => 'text',
    	'integer' => 'int(11)',
    	'float' => 'float',
    	'decimal' => 'decimal',
    	'datetime' => 'datetime',
    	'timestamp' => 'timestamp',
    	'time' => 'time',
    	'date' => 'date',
    	'binary' => 'blob',
    	'boolean' => 'tinyint(1)',
    	'money' => 'decimal(19,4)',
    

    При создании миграции мы пишем » ‘id’ => ‘pk’,» и тогда механизм миграции сам понимает, что для Mysql это нужно переписать как ‘int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY’, а для Pgsql как ‘serial NOT NULL PRIMARY KEY’. Таким образом, используя поля, определенные в схеме, вам не нужно думать об совместимости ваших команд с драйверами других БД.

  • Шаг 4: применяем миграцию. Для этого просто запускаем команду
    php yiic migrate
    

Теперь после каждого получения свежей версии с репозитория, нужно запускать эту команду для синхронизации структуры базы. Согласитесь — очень просто и легко.
Для того, чтобы откатить миграцию нужно выполнить команду

php yiic migrate down

За рамками данной статьи остались такие команды как redo, migrate to, mark и другие. Так же в статье не раскрыта тема транзакционных миграций и методов safeUp safeDown. Но то, что описано уже достаточно чтобы начать пользоваться миграциями и понять, насколько же они удобны.


Метки:

Оставить комментарий

9 комментариев »

    Manaraga

    >Шаг 2: создаем файл миграции. Удостоверьтесь в том, что у вас существует папка protected/migrations

    Откуда этот относительный путь отсчитывать?
    У меня, например, в корневой папке («yii», там где vendor, web, controllers, …) нет папки protected.

    Создать вручную?

      Developer

      Нет. У вас судя по структуре Yii2, а эта статья для Yii1.x. Вам сюда.


    Чукас

    Проблемка.
    В шабдоне миграции предусмотрен механизм транзакций (для БД которые поддерживают) . Это функции safeUp, safeDown.
    Однако не прошло. Консоль сообщила успешное прохождение, но реально в базе требуемой таблицы не оказалось.


    Чукас

    К предыдущему посту.
    Для эксперимента закоментил up(), down() и прописал изменения
    в safeUp, safeDown, как приписывает гайд http://www.yiiframework.com/doc/guide/1.1/ru/database.migration
    и это заработало. Но, как! Тут непонятки.
    При внесения кода безопасной ( с транзакцией, как бы) миграции допустил ошибку в описании ключа. В итоге:Migration failed. The rest of the migrations are canceled.. То есть ключ не создался. Но таблица в базе появилась. И никаких ролл-беков!
    Может дело в MySQL ? У меня версия 5.6. Интересно, она поддерживает такие ролл-бэки? У предыдущих версий не поддерживались такие транзакции.

      Developer

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


    Another developer

    Как отменить(down) миграцию которая находится где-то в середине в истории миграции?

      Developer

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


    Rosalinda

    I really appcariete free, succinct, reliable data like this.

      Developer

      Thanks!


Оставить комментарий:









Копирование материалов разрешено при наличии активной ссылки на источник