Миграции являются удобным инструментом для изменения структуры базы данных и поддержания ее в актуальном состоянии.
Yii2 поддерживает миграции из коробки. Использование миграций подробно описано в документации. Управление миграциями осуществляется из командной строки.
В статье описывается использование миграций для управления несколькими схемами БД. Как оказалось, это совсем несложно реализовать, но почему-то не нашел ни одного описания.
Нередко мне встречаются проекты, где используется более одной базы данных. В этом случае хочется управлять каждой базой в отдельности. Как вариант, можно в каждой миграции указывать, к какой базе данных ее применять, или явно указывать бд в каждом запросе. Но это не очень удобно и есть большая вероятность случайно накатить миграцию не на ту базу. Кроме того, таблица миграций все равно будет только в основной базе.
К сожалению, готового решения не нашел, поэтому заглянем в код фреймворка и посмотрим, как работают миграции.
Команда yii migrate использует yii\console\controllers\MigrateController
Для создания новой миграции используется шаблон migration.php
Все миграции наследуются от yii\db\Migration.
1. Для начала переопределяем базовый класс миграции для каждой БД. В папке components создаем классы CustomMigrationDb и CustomMigrationDb2
CustomMigrationDb2.php
<?php namespace app\components; use yii\db\Migration; class CustomMigrationDb2 extends Migration{ public function init() { $this->db = 'db2'; parent::init(); } }
2. В папке \views\migrations создаем файлы migration_db.php и migration_db2.php — шаблоны для новых миграций. Достаточно скопировать базовый шаблон и поменять базовый класс на те, что мы только что создали.
migration_db2.php
<?php /** * This view is used by console/controllers/MigrateController.php * The following variables are available in this view: */ /* @var $className string the new migration class name */ echo "<?php\n"; ?> use yii\db\Schema; use app\components\CustomMigrationDb2; class <?= $className ?> extends CustomMigrationDb2 { public function up() { } public function down() { echo "<?= $className ?> cannot be reverted.\n"; return false; } /* // Use safeUp/safeDown to run migration code within a transaction public function safeUp() { } public function safeDown() { } */ }
3. Теперь создаем контроллеры. В папке commands создаем классы MigrateDbController и MigrateDb2Controller. Наследуем их от yii\console\controller\MigrateController.
MigrateDb2Controller.php
<?php namespace app\commands; use yii\console\controllers\MigrateController; class MigrateDb2Controller extends MigrateController { public $db = 'db2'; public $templateFile = '@app/views/migrations/migration_db2.php'; public $migrationPath = '@app/migrations/db2'; }
Здесь указываем базу данных, в которой будет создана таблица с миграциями, шаблон для создания новых миграций и путь до папки с миграциями.
4. Отключаем стандартный yii migrate, вместо него будем использовать один из созданных контроллеров. Для этого добавим в файл \config\console.php следующий код:
'controllerMap' => [ ... 'migrate' => [ 'class' => 'app\commands\MigrateDbController', ], ],
В результате получаем независимые миграции для каждой БД. Миграции запускаются командами
yii migrate-db
yii migrate-db2
Работают как обычные миграции. Новые миграции создаются в отдельных папках для каждой бд командами
yii migrate-db/create и
yii migrate-db2/create
Написал небольшое приложение для демонстрации. Выложил на github.
Спасибо за внимание
ссылка на оригинал статьи https://habrahabr.ru/post/279701/
Добавить комментарий