Миграции базы данных
Миграции — удобный способ изменения вашей базы данных структурированным и организованным образом. Вы можете вручную редактировать фрагменты SQL, но тогда вам нужно будет сообщить другим разработчикам о необходимости их выполнения. Также вам придется отслеживать, какие изменения необходимо выполнить на производственных машинах при следующем развертывании.
Таблица базы данных migration отслеживает, какие миграции уже были выполнены, поэтому все, что вам нужно сделать, это убедиться, что ваши миграции на месте и вызвать $migration->latest(), чтобы привести базу данных к последнему состоянию. Вы также можете использовать $migration->setNamespace(null)->latest() для включения миграций из всех пространств имен.
- Имена файлов миграций
- Создание миграции
- Пример использования
- Инструменты командной строки
- Настройки миграций
- Справочник по классам
Имена файлов миграций
Каждая миграция выполняется в числовом порядке вперед или назад в зависимости от выбранного метода. Каждая миграция нумеруется с использованием отметки времени создания миграции в формате ГГГГММДДЧЧММСС (например, 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 для сопоставления имен каталогов. Она будет включать все найденные миграции в Database/Migrations.
Каждое пространство имен имеет свою собственную последовательность версий, что поможет вам обновлять и отменять каждую модуль (пространство имен) без влияния на другие пространства имен.
Например, предположим, что у нас есть следующие пространства имен, определенные в нашем файле конфигурации Autoload:
$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.
migrate
Мигрирует группу баз данных со всеми доступными миграциями:
> php spark migrate
Вы можете использовать (migrate) со следующими параметрами:
-
-g— для выбора группы баз данных, в противном случае будет использоваться группа по умолчанию. -
-n— для выбора пространства имен, в противном случае будет использоваться пространство имен (App). -
-all— для миграции всех пространств имен до последней миграции
В этом примере будет выполнена миграция пространства имен Блог с любыми новыми миграциями в группе баз данных test:
> php spark migrate -g test -n Blog
При использовании параметра -all, он будет просматривать все пространства имен, пытаясь найти любые миграции, которые не были выполнены. Все они будут собраны и отсортированы по дате создания. Это должно помочь минимизировать любые потенциальные конфликты между основным приложением и любыми модулями.
rollback
Отменяет все миграции, возвращая базу данных в пустое состояние, фактически к миграции 0:
> php spark migrate:rollback
Вы можете использовать (rollback) со следующими параметрами:
-
-g— для выбора группы баз данных, в противном случае будет использоваться группа по умолчанию. -
-b— для выбора пакета: натуральные числа указывают пакет, отрицательные числа указывают относительный пакет -
-f— для принудительного пропуска вопроса подтверждения, он задается только в производственной среде
refresh
Обновляет состояние базы данных, сначала отменив все миграции, а затем выполнив все:
> php spark migrate:refresh
Вы можете использовать (refresh) со следующими параметрами:
-
-g— для выбора группы баз данных, в противном случае будет использоваться группа по умолчанию. -
-n— для выбора пространства имен, в противном случае будет использоваться пространство имен (App). -
-all— для обновления всех пространств имен -
-f— для принудительного пропуска вопроса подтверждения, он задается только в производственной среде
status
Отображает список всех миграций и времени их выполнения или ‘–’, если они не были выполнены:
> php spark migrate:status Filename Migrated On First_migration.php 2016-04-25 04:44:22
Вы можете использовать (status) со следующими параметрами:
-
-g— для выбора группы баз данных, в противном случае будет использоваться группа по умолчанию.
make:migration
Создает шаблонный файл миграции в app/Database/Migrations. Автоматически добавляет текущую отметку времени. Имя создаваемого класса — это версия имени файла в стиле Паскаля.
> php spark make:migration <class> [options]
Вы можете использовать (make:migration) со следующими параметрами:
-
--session— Генерирует файл миграции для сессий базы данных. -
--table— Имя таблицы для использования в сессиях базы данных. По умолчанию:ci_sessions. -
--dbgroup— Группа баз данных для использования в сессиях базы данных. По умолчанию:default. -
--namespace— Установить корневое пространство имен. По умолчанию:APP_NAMESPACE. -
--suffix— Добавить название компонента в имя класса.
Настройки миграций
В следующей таблице перечислены все параметры конфигурации для миграций, доступные в app/Config/Migrations.php.
| Настройка | Значение по умолчанию | Варианты | Описание |
|---|---|---|---|
| enabled | true | true / false | Включить или отключить миграции. |
| table | migrations | None | Имя таблицы для хранения номера версии схемы. |
| timestampFormat | Y-m-d-His_ | Формат, используемый для отметки времени при создании миграции. |
Справочник по классам
-
CodeIgniter\Database\MigrationRunner -
-
findMigrations() -
Возвращает: Массив файлов миграций Тип возвращаемого значения: массив Возвращается массив имён файлов миграций, найденных в свойстве path.
-
latest($group) -
Параметры: - $group (смешанный тип) – имя группы базы данных; если null, используется группа по умолчанию.
Возвращает: trueпри успехе,falseпри ошибкеТип возвращаемого значения: bool
Ищет миграции для указанного пространства имён (или для всех пространств имён), определяет, какие миграции ещё не были выполнены, и выполняет их в порядке возрастания версии (пространства имён перемешаны).
-
regress($batch, $group) -
Параметры: - $batch (смешанный тип) – предыдущая партия для миграции вниз; 1+ указывает партию, 0 откатывает все, отрицательное значение ссылается на относительную партию (например, -3 означает «назад на три партии»)
- $group (смешанный тип) – имя группы базы данных; если null, используется группа по умолчанию.
Возвращает: trueпри успехе,falseпри ошибке или отсутствии миграцийТип возвращаемого значения: bool
Метод regress может использоваться для отката изменений до предыдущего состояния, по партиям.
$migration->regress(5); $migration->regress(-1);
-
force($path, $namespace, $group) -
Параметры: - $path (смешанный тип) – путь к валидному файлу миграции.
- $namespace (смешанный тип) – пространство имён предоставленной миграции.
- $group (смешанный тип) – имя группы базы данных; если null, используется группа по умолчанию.
Возвращает: trueпри успехе,falseпри ошибкеТип возвращаемого значения: bool
Вынуждает миграцию одного файла независимо от порядка или партий. Метод «up» или «down» определяется в зависимости от того, была ли она уже мигрирована.
Примечание
Этот метод рекомендуется только для тестирования и может привести к проблемам согласованности данных.
-
setNamespace($namespace) -
Параметры: - $namespace (строка) – пространство имён приложения.
Возвращает: Текущий экземпляр MigrationRunner
Тип возвращаемого значения: CodeIgniter\Database\MigrationRunner
Устанавливает пространство имён, в котором библиотека должна искать файлы миграций:
$migration->setNamespace($namespace)->latest();
-
setGroup($group) -
Параметры: - $group (строка) – имя группы базы данных.
Возвращает: Текущий экземпляр MigrationRunner
Тип возвращаемого значения: CodeIgniter\Database\MigrationRunner
Устанавливает группу, в которой библиотека должна искать файлы миграций:
$migration->setGroup($group)->latest();
-
© 2014–2020 British Columbia Institute of Technology
Licensed under the MIT License.
https://codeigniter.com/user_guide/dbmgmt/migration.html