Учебники

Yii — миграция базы данных

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

Yii предоставляет следующие инструменты командной строки миграции —

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

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

Давайте создадим новую базу данных миграции.

Шаг 1 — Внутри корня проекта базового шаблона приложения откройте окно консоли и запустите.

./yii migrate/create add_news_table

Приведенная выше команда создаст новый файл миграции (в данном случае m160113_102634_add_news_table.php) в папке миграций .

Файл содержит следующий код —

<?php
   use yii\db\Schema;
   use yii\db\Migration;
   class m160113_102634_add_news_table extends Migration {
      public function up() {
   
      }
      public function down() {
         echo "m160113_102634_add_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_HMMSS> — это время по Гринвичу, в которое была выполнена команда переноса, а <Имя> — аргумент, который вы указали в консоли.

Метод up () вызывается при обновлении базы данных, а метод down () вызывается при его понижении.

Шаг 2 — Чтобы добавить новую таблицу в базу данных, измените файл миграции таким образом.

<?php
   use yii\db\Schema;
   use yii\db\Migration;
   class m160113_102634_add_news_table extends Migration {
      public function up() {
         $this->createTable("news", [
            "id" => Schema::TYPE_PK,
            "title" => Schema::TYPE_STRING,
            "content" => Schema::TYPE_TEXT,
         ]);
      }
      public function down() {
         $this->dropTable('news');
      }
      /*
      // Use safeUp/safeDown to run migration code within a transaction
      public function safeUp() {
	
      }
      public function safeDown() {

      }
      */
   }
?>

В приведенном выше коде мы создали новую таблицу с именем news в методе up () и удалили эту таблицу в методе down () .

Таблица новостей состоит из трех полей: id, title и content. При создании таблицы или столбца мы должны использовать абстрактные типы, чтобы миграции не зависели от типа базы данных. Например, в случае MySQL TYPE_PK будет преобразован в int (11) NOT NUL AUTO_INCREMETN PRIMARY KEY.

Шаг 3 — Чтобы обновить базу данных, выполните эту команду.

./yii migrate

Обновление базы данных

Приведенная выше команда выведет список всех доступных миграций, которые еще не были применены. Затем, если вы подтвердите применение миграций, он запустит safeUp () или up () во всех новых классах миграции.

Шаг 4 — Чтобы применить только три доступные миграции, вы можете запустить.

./yii migrate 3

Шаг 5 — Вы также можете определить конкретную миграцию, в которую должна быть перенесена база данных.

# использование метки времени для определения миграции

yii migrate/to 160202_195501

# используя строку, которая может быть проанализирована strtotime ()

yii migrate/to "2016-01-01 19:55:01"

# используя полное имя

yii migrate/to m160202_195501_create_news_table

# используя отметку времени UNIX

yii migrate/to 1393964718

Шаг 6 — Чтобы отменить миграцию (выполнить методы down () или safeDown ()), запустите.

./yii migrate/down

Отменить миграцию

Шаг 7. Чтобы отменить самые последние пять примененных миграций, вы можете запустить.

./yii migrate/down 5

Шаг 8 — Чтобы повторить (отменить и затем снова применить) миграции, запустите.

./yii migrate/redo

Повторить миграцию

Чтобы просмотреть список уже примененных миграций, используйте эти команды —

  • yii migrate / new # показывает первые 10 новых миграций

  • yii migrate / new 3 # показывает первые 3 новых миграции

  • yii migrate / new all # показывает все новые миграции

  • yii migrate / history # показывает последние 10 примененных миграций

  • yii migrate / history 20 # показывает последние 20 примененных миграций

  • yii migrate / history all # показывает все примененные миграции

yii migrate / new # показывает первые 10 новых миграций

yii migrate / new 3 # показывает первые 3 новых миграции

yii migrate / new all # показывает все новые миграции

yii migrate / history # показывает последние 10 примененных миграций

yii migrate / history 20 # показывает последние 20 примененных миграций

yii migrate / history all # показывает все примененные миграции

Иногда вам нужно добавить или удалить столбец из определенной таблицы. Вы можете использовать методы addColumn () и dropColumn () .

Шаг 1 — Создайте новую миграцию.

./yii migrate/create add_category_to_news

Шаг 2. Измените созданный файл миграции следующим образом.

<?php
   use yii\db\Schema;
   use yii\db\Migration;
   class m160113_110909_add_category_to_news extends Migration {
      public function up() {
         $this->addColumn('news', 'category', $this->integer());
      }
      public function down() {
         $this->dropColumn('news', 'category');
      }
   }
?>

Теперь, если вы запустите ./yii migrate , столбец категории должен быть добавлен в таблицу новостей. Напротив, если вы запустите ./yii migrate / down 1 , столбец категории должен быть удален .

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

Предыдущий пример в «транзакционном пути» будет —

<?php
   use yii\db\Schema;
   use yii\db\Migration;
   class m160113_110909_add_category_to_news extends Migration {
      public function safeUp() {
         $this->addColumn('news', 'category', $this->integer());
      }
      public function safeDown() {
         $this->dropColumn('news', 'category');
      }
   }
?>

Класс yii \ db \ Migration предоставляет следующие методы для управления базами данных:

execute () — выполняет необработанный оператор SQL

createTable () — создает таблицу

renameTable () — переименовывает таблицу

insert () — вставляет одну строку

batchInsert () — вставляет несколько строк

update () — обновляет строки

delete () — удаляет строки

addColumn () — добавляет столбец

renameColumn () — переименовывает столбец

dropColumn () — удаляет столбец

alterColumn () — изменяет столбец

dropTable () — удаляет таблицу

truncateTable () — удаляет все строки в таблице

createIndex () — создает индекс

dropIndex () — удаляет индекс

addPrimaryKey () — добавляет первичный ключ

dropPrimaryKey () — Удаляет первичный ключ

addForeignKey () — добавляет внешний ключ

dropForeignKey () — удаляет внешний ключ