Миграция базы данных

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

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

  1. Tim создает новую миграцию (например, создает новую таблицу, изменяет определение столбца и т. д.).
  2. Тим совершает новую миграцию в систему управления версиями (например, Git, Mercurial).
  3. Даг обновляет свой репозиторий из системы управления версиями и получает новую миграцию.
  4. Даг применяет миграцию к своей локальной базе данных разработки, тем самым синхронизируя свою базу данных, чтобы отразить изменения, которые сделал Тим.

И следующие шаги показывают, как развернуть новую версию с миграцией базы данных в производство:

  1. Скотт создает тег выпуска для репозитория проекта, который содержит некоторые новые миграции базы данных.
  2. Скотт обновляет исходный код на рабочем сервере до тега release.
  3. Скотт применяет любые накопленные миграции базы данных в производственную базу данных.

Yii предоставляет набор средств командной строки для миграции, которые позволяют:

  • Создавать новые миграции;
  • Применять миграции;
  • Отменить миграцию;
  • Повторно применять миграции;
  • Показать историю и статус миграции.

Все эти инструменты доступны через команду yii migrate. В этом разделе мы подробно опишем, как выполнять различные задачи с использованием этих инструментов. Вы также можете получить использование каждого инструмента с помощью команды help yii help migrate.

Создание миграций

Чтобы создать новую миграцию, выполните следующую команду:

yii migrate/create <name>

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

yii migrate/create create_news_table

Вышеупомянутая команда создаст новый файл класса PHP с именем m150101_185401_create_news_table.php в каталоге @app/migrations. Файл содержит следующий код, который в основном объявляет класс миграции m150101_185401_create_news_table со скелетным кодом:

<?php

use yii\db\Migration;

class m150101_185401_create_news_table extends Migration
{
    public function up()
    {

    }

    public function down()
    {
        echo "m101129_185401_create_news_table cannot be reverted.\n";

        return false;
    }

    /*
    // Use safeUp/safeDown to run migration code within a transaction
    public function safeUp()
    {
    }

    public function safeDown()
    {
    }
    */
}

Каждая миграция базы данных определяется как PHP-класс, простирающийся от yii\db\Migration. Имя класса миграции генерируется автоматически в формате m <YYMMDD_HHMMSS> _ <Name>, где

  • <YYMMDD_HHMMSS> относится к дате времени UTC, в котором выполняется команда создания миграции.
  • <Name> - это то же самое, что и значение аргумента name, которое вы предоставляете команде.

В классе миграции вы должны писать код в методе up(), который вносит изменения в структуру базы данных. Вы также можете написать код в методе down(), чтобы отменить изменения, сделанные функцией up(). Метод up() вызывается при обновлении базы данных с помощью этой миграции, а метод down() вызывается при понижении базы данных. В следующем коде показано, как реализовать класс миграции для создания таблицы news:

<?php

use yii\db\Schema;
use yii\db\Migration;

class m150101_185401_create_news_table extends Migration
{
    public function up()
    {
        $this->createTable('news', [
            'id' => Schema::TYPE_PK,
            'title' => Schema::TYPE_STRING . ' NOT NULL',
            'content' => Schema::TYPE_TEXT,
        ]);
    }

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

Базовый класс миграции yii\db\Migration предоставляет соединение с базой данных через свойство db. Его можно использовать для управления схемой базы данных с использованием методов, описанных в разделе Работа с схемой базы данных.

Вместо использования физических типов при создании таблицы или столбца вы должны использовать абстрактные типы, чтобы ваши миграции не зависели от конкретной СУБД. Класс yii\db\Schema определяет набор констант для представления поддерживаемых абстрактных типов. Эти константы названы в формате TYPE_<Name>. Например, TYPE_PK относится к автоинкрементному типу первичного ключа; TYPE_STRING относится к строчному типу. Когда перенос применяется к конкретной базе данных, абстрактные типы будут переведены в соответствующие физические типы. В случае MySQL, TYPE_PK будет преобразован в int (11) NOT NULL AUTO_INCREMENT PRIMARY KEY, а TYPE_STRING станет varchar (255).

При использовании абстрактных типов вы можете добавить дополнительные ограничения. В приведенном выше примере NOT NULL добавляется к Schema :: TYPE_STRING, чтобы указать, что столбец не может быть null.

<?php

use yii\db\Migration;

class m150101_185401_create_news_table extends Migration
{
    public function up()
    {
        $this->createTable('news', [
            'id' => $this->primaryKey(),
            'title' => $this->string()->notNull(),
            'content' => $this->text(),
        ]);
    }

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

Создание миграций

Если имя миграции имеет специальную форму, например create_xxx_table или drop_xxx_table, тогда сгенерированный файл миграции будет содержать дополнительный код, в данном случае для создания / удаления таблиц. Ниже описаны все варианты этой функции.

Создание таблицы

yii migrate/create create_post_table

генерирует:

/**
 * Handles the creation for table `post`.
 */
class m150811_220037_create_post_table extends Migration
{
    /**
     * @inheritdoc
     */
    public function up()
    {
        $this->createTable('post', [
            'id' => $this->primaryKey()
        ]);
    }

    /**
     * @inheritdoc
     */
    public function down()
    {
        $this->dropTable('post');
    }
}

Чтобы сразу создать поля таблицы, укажите их с помощью опции --fields.

yii migrate/create create_post_table --fields="title:string,body:text"

генерирует:

/**
 * Handles the creation for table `post`.
 */
class m150811_220037_create_post_table extends Migration
{
    /**
     * @inheritdoc
     */
    public function up()
    {
        $this->createTable('post', [
            'id' => $this->primaryKey(),
            'title' => $this->string(),
            'body' => $this->text(),
        ]);
    }

    /**
     * @inheritdoc
     */
    public function down()
    {
        $this->dropTable('post');
    }
}

Вы можете указать дополнительные параметры поля.

yii migrate/create create_post_table --fields="title:string(12):notNull:unique,body:text"

генерирует:

/**
 * Handles the creation for table `post`.
 */
class m150811_220037_create_post_table extends Migration
{
    /**
     * @inheritdoc
     */
    public function up()
    {
        $this->createTable('post', [
            'id' => $this->primaryKey(),
            'title' => $this->string(12)->notNull()->unique(),
            'body' => $this->text()
        ]);
    }

    /**
     * @inheritdoc
     */
    public function down()
    {
        $this->dropTable('post');
    }
}

Внешние ключи

Генератор поддерживает внешние ключи, используя ключевое слово foreignKey.

yii migrate/create create_post_table --fields="author_id:integer:notNull:foreignKey(user),category_id:integer:defaultValue(1):foreignKey,title:string,body:text"

генерирует:

/**
 * Handles the creation for table `post`.
 * Has foreign keys to the tables:
 *
 * - `user`
 * - `category`
 */
class m160328_040430_create_post_table extends Migration
{
    /**
     * @inheritdoc
     */
    public function up()
    {
        $this->createTable('post', [
            'id' => $this->primaryKey(),
            'author_id' => $this->integer()->notNull(),
            'category_id' => $this->integer()->defaultValue(1),
            'title' => $this->string(),
            'body' => $this->text(),
        ]);

        // creates index for column `author_id`
        $this->createIndex(
            'idx-post-author_id',
            'post',
            'author_id'
        );

        // add foreign key for table `user`
        $this->addForeignKey(
            'fk-post-author_id',
            'post',
            'author_id',
            'user',
            'id',
            'CASCADE'
        );

        // creates index for column `category_id`
        $this->createIndex(
            'idx-post-category_id',
            'post',
            'category_id'
        );

        // add foreign key for table `category`
        $this->addForeignKey(
            'fk-post-category_id',
            'post',
            'category_id',
            'category',
            'id',
            'CASCADE'
        );
    }

    /**
     * @inheritdoc
     */
    public function down()
    {
        // drops foreign key for table `user`
        $this->dropForeignKey(
            'fk-post-author_id',
            'post'
        );

        // drops index for column `author_id`
        $this->dropIndex(
            'idx-post-author_id',
            'post'
        );

        // drops foreign key for table `category`
        $this->dropForeignKey(
            'fk-post-category_id',
            'post'
        );

        // drops index for column `category_id`
        $this->dropIndex(
            'idx-post-category_id',
            'post'
        );

        $this->dropTable('post');
    }
}

Позиция ключевого слова foreignKey в описании столбца не изменяет сгенерированный код. Это значит:

  • author_id:integer:notNull:foreignKey(user)
  • author_id:integer:foreignKey(user):notNull
  • author_id:foreignKey(user):integer:notNull

Все сгенерируют один и тот же код.

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

В приведенном выше примере author_id:integer:notNull:foreignKey(user) будет генерировать столбец с именем author_id с внешним ключом для таблицы user, а category_id:integer:defaultValue(1):foreignKey будет генерировать столбец category_id с внешним ключом к таблице category.

Ключевое слово foreignKey принимает второй параметр, разделенный пробелом. Он принимает имя связанного столбца для сгенерированного внешнего ключа. Если второй параметр не передан, имя столбца будет выбрано из схемы таблицы. Если схемы не существует, первичный ключ не установлен или является составным, будет использован id имени по умолчанию.

Удаление таблицы

yii migrate/create drop_post_table --fields="title:string(12):notNull:unique,body:text"

генерирует:

class m150811_220037_drop_post_table extends Migration
{
    public function up()
    {
        $this->dropTable('post');
    }

    public function down()
    {
        $this->createTable('post', [
            'id' => $this->primaryKey(),
            'title' => $this->string(12)->notNull()->unique(),
            'body' => $this->text()
        ]);
    }
}

Добавить столбец

Если имя миграции имеет форму add_xxx_column_to_yyy_table, содержимое файла будет содержать инструкции addColumn и dropColumn.

Чтобы добавить столбец:

yii migrate/create add_position_column_to_post_table --fields="position:integer"

генерирует:

class m150811_220037_add_position_column_to_post_table extends Migration
{
    public function up()
    {
        $this->addColumn('post', 'position', $this->integer());
    }

    public function down()
    {
        $this->dropColumn('post', 'position');
    }
}

Вы можете указать несколько столбцов следующим образом:

yii migrate/create add_xxx_column_yyy_column_to_zzz_table --fields="xxx:integer,yyy:text"

Удаление столбца

Если имя миграции имеет форму drop_xxx_column_from_yyy_table, содержимое файла будет содержать инструкции addColumn и dropColumn.

yii migrate/create drop_position_column_from_post_table --fields="position:integer"

генерирует:

class m150811_220037_drop_position_column_from_post_table extends Migration
{
    public function up()
    {
        $this->dropColumn('post', 'position');
    }

    public function down()
    {
        $this->addColumn('post', 'position', $this->integer());
    }
}

Добавить таблицу соединений

Если имя миграции имеет форму create_junction_table_for_xxx_and_yyy_tables или create_junction_xxx_and_yyy_tables, тогда будет создан код, необходимый для создания таблицы соединений.

yii migrate/create create_junction_table_for_post_and_tag_tables --fields="created_at:dateTime"

генерирует:

/**
 * Handles the creation for table `post_tag`.
 * Has foreign keys to the tables:
 *
 * - `post`
 * - `tag`
 */
class m160328_041642_create_junction_table_for_post_and_tag_tables extends Migration
{
    /**
     * @inheritdoc
     */
    public function up()
    {
        $this->createTable('post_tag', [
            'post_id' => $this->integer(),
            'tag_id' => $this->integer(),
            'created_at' => $this->dateTime(),
            'PRIMARY KEY(post_id, tag_id)',
        ]);

        // creates index for column `post_id`
        $this->createIndex(
            'idx-post_tag-post_id',
            'post_tag',
            'post_id'
        );

        // add foreign key for table `post`
        $this->addForeignKey(
            'fk-post_tag-post_id',
            'post_tag',
            'post_id',
            'post',
            'id',
            'CASCADE'
        );

        // creates index for column `tag_id`
        $this->createIndex(
            'idx-post_tag-tag_id',
            'post_tag',
            'tag_id'
        );

        // add foreign key for table `tag`
        $this->addForeignKey(
            'fk-post_tag-tag_id',
            'post_tag',
            'tag_id',
            'tag',
            'id',
            'CASCADE'
        );
    }

    /**
     * @inheritdoc
     */
    public function down()
    {
        // drops foreign key for table `post`
        $this->dropForeignKey(
            'fk-post_tag-post_id',
            'post_tag'
        );

        // drops index for column `post_id`
        $this->dropIndex(
            'idx-post_tag-post_id',
            'post_tag'
        );

        // drops foreign key for table `tag`
        $this->dropForeignKey(
            'fk-post_tag-tag_id',
            'post_tag'
        );

        // drops index for column `tag_id`
        $this->dropIndex(
            'idx-post_tag-tag_id',
            'post_tag'
        );

        $this->dropTable('post_tag');
    }
}

Имена столбцов внешнего ключа для таблиц соединений извлекаются из схемы таблиц. Если таблица не определена в схеме или первичный ключ не установлен или составной, используется id имени по умолчанию.

Транзакционные миграции

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

Еще более простой способ реализации транзакционных переносов - поместить код миграции в методы safeUp() и safeDown(). Эти два метода отличаются от up() и down() тем, что они заключены в транзакцию неявно. В результате, если какая-либо операция в этих методах завершится неудачно, все предыдущие операции будут откат автоматически.

В следующем примере, кроме создания таблицы news, мы также вставляем начальную строку в эту таблицу.

<?php

use yii\db\Migration;

class m150101_185401_create_news_table extends Migration
{
    public function safeUp()
    {
        $this->createTable('news', [
            'id' => $this->primaryKey(),
            'title' => $this->string()->notNull(),
            'content' => $this->text(),
        ]);

        $this->insert('news', [
            'title' => 'test 1',
            'content' => 'content 1',
        ]);
    }

    public function safeDown()
    {
        $this->delete('news', ['id' => 1]);
        $this->dropTable('news');
    }
}

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

Методы доступа к базе данных

Базовый класс миграции yii\db\Migration предоставляет набор методов, позволяющих вам обращаться к базам данных и манипулировать ими. Вы можете обнаружить, что эти методы названы так же, как методы DAO, предоставляемые классом yii\db\Command. Например, метод yii\db\Migration::createTable() позволяет вам создать новую таблицу, как это делает yii\db\Command::createTable().

Преимущество использования методов, предоставляемых yii\db\Migration, заключается в том, что вам не нужно явно создавать экземпляры yii\db\Command, и при выполнении каждого метода будут автоматически отображаться полезные сообщения о том, какие операции с базой данных выполнены.

Ниже приведен список всех этих методов доступа к базе данных:

  • execute(): выполнение инструкции SQL
  • insert(): вставка одной строки
  • batchInsert(): вставка нескольких строк
  • update(): обновление строк
  • delete(): удаление строк
  • createTable(): создание таблицы
  • renameTable(): переименование таблицы
  • dropTable(): удаление таблицы
  • truncateTable(): удаление всех строк в таблице
  • addColumn(): добавление столбца
  • renameColumn(): переименование столбца
  • dropColumn(): удаление столбца
  • alterColumn(): изменение столбца
  • addPrimaryKey(): добавление первичного ключа
  • dropPrimaryKey(): удаление первичного ключа
  • AddForeignKey(): добавление внешнего ключа
  • DropForeignKey(): удаление внешнего ключа
  • CreateIndex(): создание индекса
  • DropIndex(): удаление индекса
  • AddCommentOnColumn(): добавление комментария к столбцу
  • DropCommentFromColumn(): отбрасывание комментария из столбца
  • AddCommentOnTable(): добавление комментария к таблице
  • DropCommentFromTable(): удаление комментария из таблицы

Применение миграции

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

yii migrate

Эта команда отобразит все миграции, которые не были применены до сих пор. Если вы подтвердите, что хотите применить эти миграции, он будет запускать метод up() или safeUp() в каждом новом классе миграции один за другим в порядке их значений временной метки. Если какой-либо из миграций не удается, команда прекратит работу, не применяя остальные миграции.

Для каждой миграции, которая была успешно применена, команда вставляет строку в таблицу базы данных с именем migration для записи успешного применения миграции. Это позволит инструменту миграции определить, какие миграции были применены, а какие нет.

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

yii migrate 3

Вы также можете явно указать конкретную миграцию, в которую следует мигрировать базу данных, с помощью команды migrate/to в одном из следующих форматов:

yii migrate/to 150101_185401                      # using timestamp to specify the migration
yii migrate/to "2015-01-01 18:54:01"              # using a string that can be parsed by strtotime()
yii migrate/to m150101_185401_create_news_table   # using full name
yii migrate/to 1392853618                         # using UNIX timestamp

Если какие-либо непримененные миграции выполняются раньше указанного, все они будут применены до того, как будет применена указанная миграция. Если указанная миграция уже была применена ранее, любые последующие миграции будут отменены.

Отмена переноса

Чтобы вернуть (отменить) одну или несколько миграций, которые были применены ранее, вы можете запустить следующую команду:

yii migrate/down     # revert the most recently applied migration
yii migrate/down 3   # revert the most 3 recently applied migrations

Повторная миграция

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

yii migrate/redo        # redo the last applied migration
yii migrate/redo 3      # redo the last 3 applied migrations

Листинг миграции

Чтобы указать, какие переносы были применены, а какие нет, вы можете использовать следующие команды:

yii migrate/history     # showing the last 10 applied migrations
yii migrate/history 5   # showing the last 5 applied migrations
yii migrate/history all # showing all applied migrations

yii migrate/new         # showing the first 10 new migrations
yii migrate/new 5       # showing the first 5 new migrations
yii migrate/new all     # showing all new migrations

Изменение истории миграции

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

yii migrate/mark 150101_185401                      # using timestamp to specify the migration
yii migrate/mark "2015-01-01 18:54:01"              # using a string that can be parsed by strtotime()
yii migrate/mark m150101_185401_create_news_table   # using full name
yii migrate/mark 1392853618                         # using UNIX timestamp

Команда изменит таблицу migration, добавив или удалив определенные строки, чтобы указать, что в базе данных были применены миграции к указанному. Эта миграция не будет применена или отменена.

Персонализация миграции

Существует несколько способов настройки команды перенастройки.

Использование параметров командной строки

Команда перенастройки содержит несколько параметров командной строки, которые можно использовать для настройки ее поведения:

  • Interactive: boolean (по умолчанию true), указывает, следует ли выполнять миграции в интерактивном режиме. Если это true, пользователю будет предложено выполнить команду, прежде чем она выполнит определенные действия. Вы можете установить это значение false, если команда используется в фоновом процессе.
  • migrationPath: string (по умолчанию используется @app/migrations), указывает каталог, в котором хранятся все файлы классов миграции. Это может быть указано как путь к каталогу или псевдоним пути. Обратите внимание, что каталог должен существовать, иначе команда может вызвать ошибку.
  • migrationTable: строка (по умолчанию для migration), задает имя таблицы базы данных для хранения информации истории миграции. Таблица будет автоматически создана командой, если она не существует. Вы также можете создать его вручную, используя первичный ключ структуры version varchar(255) primary key, apply_time integer.
  • db: string (по умолчанию db), указывает идентификатор компонента приложения базы данных. Он представляет базу данных, которая будет перенесена с помощью этой команды.
  • templateFile: string (по умолчанию @yii/views/migration.php), указывает путь к файлу шаблона, который используется для создания файлов классов миграции скелета. Это может быть указано как путь к файлу или псевдоним пути. Файл шаблона представляет собой скрипт PHP, в котором вы можете использовать предопределенную переменную с именем $className, чтобы получить имя класса миграции.
  • generatorTemplateFiles: массив (по умолчанию используется):
[
  'create_table' => '@yii/views/createTableMigration.php',
  'drop_table' => '@yii/views/dropTableMigration.php',
  'add_column' => '@yii/views/addColumnMigration.php',
  'drop_column' => '@yii/views/dropColumnMigration.php',
  'create_junction' => '@yii/views/createTableMigration.php'
]
  • fields: массив строк определения столбцов, используемых для создания кода миграции. По умолчанию установлено значение []. Формат каждого определения: COLUMN_NAME: COLUMN_TYPE: COLUMN_DECORATOR. Например, --fields=name:string(12):notNull выдает столбец строки размером 12, который не равен null.

В следующем примере показано, как вы можете использовать эти параметры. Например, если мы хотим перенести модуль forum, файлы миграции которого находятся в каталоге migrations модуля, мы можем использовать следующую команду:

# migrate the migrations in a forum module non-interactively
yii migrate --migrationPath=@app/modules/forum/migrations --interactive=0

Конфигурация команды глобально

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

return [
    'controllerMap' => [
        'migrate' => [
            'class' => 'yii\console\controllers\MigrateController',
            'migrationTable' => 'backend_migration',
        ],
    ],
];

При указанной конфигурации каждый раз, когда вы запускаете команду перенастройки, таблица backend_migration будет использоваться для записи истории миграции. Вам больше не нужно указывать его через параметр командной строки migrationTable.

Миграция имен

Вы можете использовать пространства имен для классов миграции. Вы можете указать список пространств имен миграции через migrationNamespaces. Использование пространств имен для классов миграции позволяет вам использовать несколько исходных местоположений для миграции. Например:

return [
    'controllerMap' => [
        'migrate' => [
            'class' => 'yii\console\controllers\MigrateController',
            'migrationNamespaces' => [
                'app\migrations', // Common migrations for the whole application
                'module\migrations', // Migrations for the specific project's module
                'some\extension\migrations', // Migrations for the specific extension
            ],
        ],
    ],
];

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

yii migrate/create 'app\\migrations\\createUserTable'

Разделенные миграции

Иногда использование единой истории миграции для всех миграций проектов нежелательно. Например: вы можете установить какое-то расширение «блога», которое содержит полностью разделенные функции и содержит свои собственные миграции, что не должно влиять на те, которые посвящены основным функциям проекта.

Если вы хотите, чтобы несколько миграций применялись и отслеживались полностью отделенными друг от друга, вы можете настроить несколько команд миграции, которые будут использовать разные пространства имен и таблицы истории миграции:

return [
    'controllerMap' => [
        // Common migrations for the whole application
        'migrate-app' => [
            'class' => 'yii\console\controllers\MigrateController',
            'migrationNamespaces' => ['app\migrations'],
            'migrationTable' => 'migration_app',
        ],
        // Migrations for the specific project's module
        'migrate-module' => [
            'class' => 'yii\console\controllers\MigrateController',
            'migrationNamespaces' => ['module\migrations'],
            'migrationTable' => 'migration_module',
        ],
        // Migrations for the specific extension
        'migrate-rbac' => [
            'class' => 'yii\console\controllers\MigrateController',
            'migrationPath' => '@yii/rbac/migrations',
            'migrationTable' => 'migration_rbac',
        ],
    ],
];

Обратите внимание, что для синхронизации базы данных вам нужно запустить несколько команд вместо одного:

yii migrate-app
yii migrate-module
yii migrate-rbac

Миграция нескольких баз данных

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

yii migrate --db=db2

Приведенная выше команда применит перенос к базе данных db2.

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

<?php

use yii\db\Migration;

class m150101_185401_create_news_table extends Migration
{
    public function init()
    {
        $this->db = 'db2';
        parent::init();
    }
}

Вышеупомянутая миграция будет применена к db2, даже если вы укажете другую базу данных через опцию командной строки db. Обратите внимание, что история миграции по-прежнему будет записываться в базу данных, указанную параметром командной строки db.

Если у вас несколько миграций, использующих одну и ту же базу данных, рекомендуется создать базовый класс миграции с помощью вышеуказанного кода init(). Тогда каждый класс миграции может распространяться от этого базового класса.

Еще одна стратегия, которую вы можете предпринять для миграции нескольких баз данных, - это миграция различных баз данных в разные пути миграции. Затем вы можете перенести эти базы данных в отдельные команды, например:

yii migrate --migrationPath=@app/migrations/db1 --db=db1
yii migrate --migrationPath=@app/migrations/db2 --db=db2
...

Первая команда применит миграции в @app/migrations/db1 к базе данных db1, вторая - применит миграции в @app/migrations/db2 к db2 и т. д.