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

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

Миграция таблицы базы данных отслеживает, какие миграции уже были выполнены, поэтому все, что вам нужно сделать, это убедиться, что ваши миграции на месте, и вызвать, $migration->latest()чтобы привести базу данных в самое последнее состояние. Вы также можете использовать $migration->setNamespace(null)->latest()для включения миграции из всех пространств имен.

Имена файлов миграции

Каждая миграция выполняется в числовом порядке вперед или назад в зависимости от выбранного метода. Каждая миграция пронумерована с использованием метки времени , когда была создана миграция, в YYYYMMDDHHIISS формате (например , 20121031100537 ). Это помогает предотвратить конфликты нумерации при работе в коллективе.

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

  • 20121031100537_add_blog.php
  • 2012-10-31-100538_alter_blog_track_views.php
  • 2012_10_31_100539_alter_blog_add_translations.php

Создать миграцию

Это будет первая миграция для нового сайта, на котором есть блог. Все миграции проходят в каталоге app / Database / Migrations / и имеют такие имена, как 20121031100537_add_blog.php .

<?php namespace App\Database\Migrations;

use CodeIgniter\Database\Migration;

class AddBlog extends Migration
{

        public function up()
        {
                $this->forge->addField([
                        'blog_id'          => [
                                'type'           => 'INT',
                                'constraint'     => 5,
                                'unsigned'       => true,
                                'auto_increment' => true,
                        ],
                        'blog_title'       => [
                                'type'           => 'VARCHAR',
                                'constraint'     => '100',
                        ],
                        'blog_description' => [
                                'type'           => 'TEXT',
                                'null'           => true,
                        ],
                ]);
                $this->forge->addKey('blog_id', true);
                $this->forge->createTable('blog');
        }

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

Соединение с базой данных и класс Forge базы данных доступны вам через $this->dbи $this->forge, соответственно.

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

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

Когда ваши таблицы содержат внешние ключи, миграции часто могут вызывать проблемы, когда вы пытаетесь удалить таблицы и столбцы. Чтобы временно обойти проверки внешнего ключа при выполнении миграции, используйте методы disableForeignKeyChecks()и enableForeignKeyChecks()в соединении с базой данных.

public function up()
{
        $this->db->disableForeignKeyChecks()

        // Migration rules would go here..

        $this->db->enableForeignKeyChecks();
}

Группы баз данных

Миграция будет запущена только для одной группы баз данных. Если у вас есть несколько групп, определенных в app / Config / Database.php , тогда он будет работать против, $defaultGroupкак указано в том же файле конфигурации. Могут быть случаи, когда вам понадобятся разные схемы для разных групп баз данных. Возможно, у вас есть одна база данных, которая используется для всей общей информации сайта, а другая база данных используется для критически важных данных. Вы можете гарантировать, что миграции выполняются только для правильной группы, установив $DBGroupсвойство в вашей миграции. Это имя должно точно совпадать с названием группы базы данных:

<?php namespace App\Database\Migrations;

use CodeIgniter\Database\Migration;

class AddBlog extends Migration
{
        protected $DBGroup = 'alternate_db_group';

        public function up() { . . . }

        public function down() { . . . }
}

Пространства имён

Библиотека миграции может автоматически сканировать все пространства имен, которые вы определили в app / Config / Autoload.php или загрузили из внешнего источника, такого как Composer, используя $psr4свойство для сопоставления имен каталогов. Он будет включать все миграции, которые он найдет в базе данных / Migrations.

Каждое пространство имен имеет свою собственную последовательность версий, это поможет вам обновить и понизить версию каждого модуля (пространства имен), не затрагивая другие пространства имен.

Например, предположим, что в нашем файле конфигурации автозагрузки определены следующие пространства имен:

$psr4 = [
        'App'       => APPPATH,
        'MyCompany' => ROOTPATH . 'MyCompany',
];

Это будет искать любые миграции, расположенные как в APPPATH / Database / Migrations, так и в ROOTPATH ​​/ MyCompany / Database / Migrations . Это упрощает включение миграций в многократно используемые модульные наборы кода.

Пример использования

В этом примере в app / Controllers / Migrate.php помещен простой код для обновления схемы:

<?php namespace App\Controllers;

class Migrate extends \CodeIgniter\Controller
{

        public function index()
        {
                $migrate = \Config\Services::migrations();

                try
                {
                        $migrate->latest();
                }
                catch (\Throwable $e)
                {
                        // Do something with the error here...
                }
        }

}

Инструменты командной строки

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

мигрировать

Переносит группу базы данных со всеми доступными миграциями:

> php spark migrate

Вы можете использовать (перенести) со следующими параметрами:

  • -g — выбрать группу БД, иначе будет использоваться группа БД по умолчанию.
  • -n — выбрать пространство имен, иначе будет использоваться пространство имен (App).
  • -all — перенести все пространства имен на последнюю миграцию

В этом примере выполняется миграция пространства имен Blog с любыми новыми миграциями в тестовой группе баз данных:

> php spark migrate -g test -n Blog

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

откат

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

> php spark migrate:rollback

Вы можете использовать (откат) со следующими параметрами:

  • -g — выбрать группу БД, иначе будет использоваться группа БД по умолчанию.
  • -b — выбрать партию: натуральные числа указывают партию, отрицательные — относительную партию
  • -f — для принудительного обхода вопроса подтверждения, он задается только в производственной среде

обновить

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

> php spark migrate:refresh

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

  • -g — выбрать группу БД, иначе будет использоваться группа БД по умолчанию.
  • -n — выбрать пространство имен, иначе будет использоваться пространство имен (App).
  • -all — обновить все пространства имен
  • -f — для принудительного обхода вопроса подтверждения, он задается только в производственной среде

положение дел

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

> php spark migrate:status
Filename               Migrated On
First_migration.php    2016-04-25 04:44:22

Вы можете использовать (статус) со следующими параметрами:

  • -g — выбрать группу БД, иначе будет использоваться группа БД по умолчанию.

Создайте

Создает файл миграции скелета в app / Database / Migrations . Он автоматически добавляет текущую временную метку. Имя класса, которое он создает, является версией имени файла в регистре Паскаля.

> php spark migrate:create [filename]

Вы можете использовать (создать) со следующими параметрами:

  • -n — выбрать пространство имен, иначе будет использоваться пространство имен (App).

Настройки миграции

Ниже приводится таблица всех параметров конфигурации для миграции, доступная в app / Config / Migrations.php .

ПредпочтениеПо умолчаниюПараметрыОписание
включенправдаправда / ложьВключите или отключите миграцию.
ТаблицамиграцииНиктоИмя таблицы для хранения номера версии схемы.
timestampFormatYmd-His_ Формат, используемый для отметок времени при создании миграции.

Ссылка на класс

CodeIgniter\Database\MigrationRunnerfindMigrations( )

Возврат:Массив файлов миграции
Тип возврата:массив

Возвращается массив имён файлов миграции, которые находятся в свойстве path .latest$ группа )

Параметры:$ group ( смешанный ) — имя группы БД, если будет использоваться пустая группа БД по умолчанию.
Возврат:trueпри успехе, falseпри неудаче
Тип возврата:bool

Это обнаруживает миграции для пространства имен (или всех пространств имен), определяет, какие миграции еще не были запущены, и запускает их в порядке их версии (пространства имен перемешаны).regress$ партия , $ группа )

Параметры:$ batch ( смешанный ) — предыдущий пакет, к которому нужно перейти; 1+ указывает пакет, 0 отменяет все, отрицательный относится к относительной партии (например, -3 означает «три партии назад»)$ group ( смешанный ) — имя группы БД, если будет использоваться пустая группа БД по умолчанию.
Возврат:trueпри успехе, falseпри неудаче или миграции не обнаружены
Тип возврата:bool

Регресс можно использовать для отката изменений к предыдущему состоянию, пакет за пакетом.

$migration->batch(5);
$migration->batch(-1);

force$ путь , $ пространство имен , $ группа )

Параметры:$ path ( смешанный ) — путь к действующему файлу миграции.$ namespace ( смешанный ) — пространство имен предоставленной миграции.$ group ( смешанный ) — имя группы БД, если будет использоваться пустая группа БД по умолчанию.
Возврат:trueпри успехе, falseпри неудаче
Тип возврата:bool

Это заставляет переносить один файл независимо от порядка или пакетов. Метод «вверх» или «вниз» определяется в зависимости от того, был ли он уже перенесен. Примечание . Этот метод рекомендуется только для тестирования и может вызвать проблемы с согласованностью данных.setNamespace$ пространство имен )

Параметры:$ namespace ( строка ) — пространство имен приложения.
Возврат:Текущий экземпляр MigrationRunner
Тип возврата:CodeIgniter \ База данных \ MigrationRunner

Задает путь, по которому библиотека должна искать файлы миграции:

$migration->setNamespace($path)
          ->latest();

setGroup$ группа )

Параметры:$ group ( строка ) — имя группы базы данных.
Возврат:Текущий экземпляр MigrationRunner
Тип возврата:CodeIgniter \ База данных \ MigrationRunner

Задает путь, по которому библиотека должна искать файлы миграции:

$migration->setNamespace($path)
          ->latest();

Добавить комментарий