Oct 20 2014
Миграции в Framework Yii 2
В Yii 2 есть механизм миграций. По сути миграции в БД это изменение структуры.
Создание миграций:
yii migrate/create <name>
name – параметр принимающий имя миграции
После выполнения команды будет создан класс:
class m141018_180924_18102014 extends Migration { public function up() { } public function down() { echo "m141018_180924_18102014 cannot be reverted.\n"; return false; } }
В метод up() содержится код, который должен быть выполнен при накатывании миграции. В методе down() содержится код, который выполнится при откате миграции. Пример миграции:
class m141018_180924_18102014 extends Migration { public function up() { $tableOptions = null; if ($this->db->driverName === 'mysql') { $tableOptions = 'CHARACTER SET utf8 COLLATE utf8_general_ci ENGINE=InnoDB'; } $this->createTable('{{%category}}', [ 'id' => Schema::TYPE_PK, 'title' => Schema::TYPE_STRING . ' NOT NULL', ], $tableOptions); $this->createTable('{{%post}}', [ 'id' => Schema::TYPE_PK, 'title' => Schema::TYPE_STRING . ' NOT NULL', 'anons' => Schema::TYPE_TEXT . ' NOT NULL', 'content' => Schema::TYPE_TEXT . ' NOT NULL', 'category_id' => Schema::TYPE_INTEGER, 'author_id' => Schema::TYPE_INTEGER, 'publish_status' => "enum('" . Post::STATUS_DRAFT . "','" . Post::STATUS_PUBLISH . "') NOT NULL DEFAULT '" . Post::STATUS_DRAFT . "'", 'publish_date' => Schema::TYPE_TIMESTAMP . ' NOT NULL', ], $tableOptions); $this->createIndex('FK_post_author', '{{%post}}', 'author_id'); $this->addForeignKey( 'FK_post_author', '{{%post}}', 'author_id', '{{%user}}', 'id', 'SET NULL', 'CASCADE' ); $this->createIndex('FK_post_category', '{{%post}}', 'category_id'); $this->addForeignKey( 'FK_post_category', '{{%post}}', 'category_id', '{{%category}}', 'id', 'SET NULL', 'CASCADE' ); } public function down() { $this->dropTable('{{%post}}'); $this->dropTable('{{%category}}'); } }
Данная миграция создаёт две таблицы и два внешних ключа.
Для создания таблицы используется метод createTable() принимающий два обязательных параметра, имя таблицы и масив описывающий свойства полей таблицы.
Для создания внешних ключей используются методы createIndex() для создания индекса, принимающий три параметра: имя индекса, имя таблицы и имя поля. И метод addForeignKey() принимающий семь параметров: имя внешнего ключа, имя таблицы и имя поля к которой добавляется ключ, имя таблицы и имя поля на которые ссылается ключ, стратегии при удалении и обновлении.
Для применения миграций используется команда:
yii migrate
Для применения нескольких миграций используется команда:
yii migrate/up 2
где 2 – число применяемых миграций
Для применения определённой версии миграции используется команда:
yii migrate/to 141018_180924
где 141018_180924 – timestamp миграций
Команда для отката миграции
yii migrate/down [step][step] – количество отменяемых миграций
Для повторного применения миграции применяется команда
yii migrate/redo [step][step] – количество повторно применяемых миграций
Просмотр примененных миграций:
yii migrate/history [limit][limit] – количество выводимых записей
Просмотр списка новых миграций, которые ещё не были применены:
yii migrate/new [limit][limit] – количество выводимых записей
Александр
Dec 10, 2014 @ 14:03:44
А зачем создаётся таблица “tbl_migration”?
Georgy Spack
Dec 11, 2014 @ 23:14:19
Таблица содержит информацию об истории миграций.
Андрей
Mar 31, 2015 @ 09:42:37
С tbl_migration всё ясно, а как быть с самими таблицами которые миграция должна создать, она что их создаёт не в бд а в файловой системе? или нужно что-то где перенастроить. В конфиге всё указано нормально.
Georgy Spack
Mar 31, 2015 @ 09:50:42
Миграция может создавать таблицы, а может изменять уже имеющиеся. Производиться изменения будут в БД. Если Вам нужно создавать таблицу, тогда в теле метода public function up() пишите запрос на создание таблицы как это приведено в примере статьи:
$this->createTable('{{%category}}', [
'id' => Schema::TYPE_PK,
'title' => Schema::TYPE_STRING . ' NOT NULL',
], $tableOptions);
Ещё примеры миграций Вы можете поглядеть тут
Karen
Feb 12, 2015 @ 11:09:43
В данном случае лучше использовать safeUp http://www.yiiframework.com/doc-2.0/guide-db-migrations.html#transactional-migrations
Georgy Spack
Feb 14, 2015 @ 09:06:28
Спасибо Karen, действительно safeUp лучше, он гарантирует целостность в случае неудачи одного из запросов.
Дмитрий
Oct 21, 2015 @ 12:31:07
глюк словил при миграциях в уйй2. а точнее транзакция не откатывает взад!
ответ по миграциям прост… Муйскуль не поддерживает транзакции мета-данных… коими являются создание бд…
в случае подения он не откатит созданные таблицы
Georgy Spack
Oct 21, 2015 @ 21:44:22
Это всё же к yii2 мало относится. В MySQL это поведение описано: Statements That Cannot Be Rolled Back
Дмитрий
Oct 22, 2015 @ 05:56:44
К тому что в MySQL safeUp лучше только при определенных операциях (вставках например). При создании новых таблиц гарантии целостности с safeUp нет. И это нужно понимать.
ksetrin
Apr 18, 2015 @ 17:01:07
Почему используется запись ‘{{%category}}’ вместо ‘category’? В чем разница?
Georgy Spack
Apr 18, 2015 @ 22:40:24
{{%category}} такая запись учитывает префикс таблиц
German
Aug 26, 2015 @ 15:20:39
Хорошая статья.
Макс
Jan 11, 2017 @ 16:59:40
Все классно только 141018_180924 – это не timestamp как вы пишите.
Вот шаблон генерации имени миграции:
m_
Макс
Jan 11, 2017 @ 17:01:12
редактор срезал дублирую
mYYMMDD_HHMMSS_Name
Georg Spack
Jan 24, 2017 @ 23:28:57
Это именно Timestamp. Timestamp (дословно с англ. — «печать/отметка времени») — это последовательность символов или закодированной информации, показывающей, когда произошло определённое событие. Обычно показывает дату и время (иногда с точностью до долей секунд).
Вы лишь указываете формат этого Timestamp.