Миграции — это незаменимый инструмент при совместной работе над проектом. Каждый разработчик меняет что-то в структуре БД. Остальным приходится делать те-же изменения в своей локальной базе. Какие изменения нужно внести? Какие изменения я уже применял в своей базе? Где найти изменения, что сделал в структуре БД другой программист? Всю головную боль на себя возьмет механизм миграций. А пользоваться им проще простого. Главное чтобы все разработчики, участвующие в проекте пользовались им.
'components'=>array( 'db'=>array( 'connectionString' => 'mysql:host=localhost;dbname=mydb', 'emulatePrepare' => true, 'username' => 'myuser', 'password' => 'mypass', 'charset' => 'utf8', ),
На мой взгляд то, что для миграций и приложения можно использовать разный коннект — просто замечательная идея! Можно разделить права пользователей для доступа к базе и только от имени пользователя, прописанного в консольном коннекте разрешать изменения в структуре БД. Это в какой-то мере защитит базу в случаи несанкционированного доступа из приложения.
php yiic migrate create <name>
yiic — это исполняемый файл в папке protected. Вместо «name» нужно написать имя для своей миграции. Выбирайте имя, говорящее о том, что именно произойдет в миграции. Например «create_my_table» или «add_name_in_user_table». Разрешенными символами для имени миграции являются латинские буквы и знак подчеркивания. В случаи успешного выполнения команды в папке 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’. Таким образом, используя поля, определенные в схеме, вам не нужно думать об совместимости ваших команд с драйверами других БД.
php yiic migrate
Теперь после каждого получения свежей версии с репозитория, нужно запускать эту команду для синхронизации структуры базы. Согласитесь — очень просто и легко.
Для того, чтобы откатить миграцию нужно выполнить команду
php yiic migrate down
За рамками данной статьи остались такие команды как redo, migrate to, mark и другие. Так же в статье не раскрыта тема транзакционных миграций и методов safeUp safeDown. Но то, что описано уже достаточно чтобы начать пользоваться миграциями и понять, насколько же они удобны.
>Шаг 2: создаем файл миграции. Удостоверьтесь в том, что у вас существует папка protected/migrations
Откуда этот относительный путь отсчитывать?
У меня, например, в корневой папке («yii», там где vendor, web, controllers, …) нет папки protected.
Создать вручную?
Нет. У вас судя по структуре 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. Интересно, она поддерживает такие ролл-бэки? У предыдущих версий не поддерживались такие транзакции.
MySQL не поддерживает транзакции для изменения схемы. Т.е любое изменение структуры таблиц, ключей, индексов и тп в MySQL сразу неявно завершает транзакцию.
Как отменить(down) миграцию которая находится где-то в середине в истории миграции?
Откатить все миграции которые были после той, что нужно отменить, включая ту что хотите отменить, и накатить снова все миграции после той что отменили. Вдруг последующие миграции используют таблицы/столбцы что создавались этой? Последовательным применением всех последующих миграций вы это и проверите.
I really appcariete free, succinct, reliable data like this.
Thanks!