データベースマイグレーション

マイグレーションは、構造化され整理された方法でデータベースを変更するための便利な方法です。SQL の断片を手動で編集することもできますが、他の開発者にそれらを実行する必要があることを伝える責任があります。また、次回デプロイするときに、本番マシンに対してどの変更を実行する必要があるかを追跡する必要もあります。

データベーステーブル **migrations** は、既に実行されたマイグレーションを追跡するため、マイグレーションが適切な場所にあることを確認し、`spark migrate` コマンドを実行してデータベースを最新の状態にするだけです。また、`spark migrate --all` を使用して、すべての名前空間からのマイグレーションを含めることもできます。

マイグレーションファイル名

各マイグレーションは、採用された方法に応じて、数値順に前方または後方に実行されます。各マイグレーションには、マイグレーションが作成されたときのタイムスタンプが **YYYY-MM-DD-HHIISS** 形式(例:**2012-10-31-100537**)で番号が付けられます。これは、チーム環境で作業する場合の番号付けの競合を防ぐのに役立ちます。

マイグレーションファイルの先頭に、マイグレーション番号、アンダースコア、マイグレーションのわかりやすい名前を付けます。年、月、日は、ダッシュ、アンダースコア、または何も使用せずに区切ることができます。例えば

  • 2012-10-31-100538_AlterBlogTrackViews.php

  • 2012_10_31_100539_AlterBlogAddTranslations.php

  • 20121031100537_AddBlog.php

マイグレーションの作成

これは、ブログを持つ新しいサイトの最初のマイグレーションになります。すべてのマイグレーションは **app/Database/Migrations/` ディレクトリに配置され、**2022-01-31-013057_AddBlog.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` を介して利用できます。

または、コマンドライン呼び出しを使用して、スケルトンマイグレーションファイルを生成することもできます。詳細は、コマンドラインツール の **make:migration** を参照してください。

注意

マイグレーションクラスは PHP クラスであるため、クラス名はすべてのマイグレーションファイルで一意である必要があります。

外部キー

テーブルに外部キーが含まれている場合、テーブルとカラムを削除しようとすると、マイグレーションで問題が発生することがよくあります。マイグレーションの実行中に外部キーチェックを一時的にバイパスするには、データベース接続で `disableForeignKeyChecks()` と `enableForeignKeyChecks()` メソッドを使用します。

<?php

namespace App\Database\Migrations;

use CodeIgniter\Database\Migration;

class AddBlog extends Migration
{
    public function up()
    {
        $this->db->disableForeignKeyChecks();

        // Migration rules would go here..

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

データベースグループ

マイグレーションは、単一のデータベースグループに対してのみ実行されます。 **app/Config/Database.php** に複数のグループが定義されている場合、デフォルトでは、同じ設定ファイルで指定されている `$defaultGroup` に対して実行されます。

データベースグループごとに異なるスキーマが必要になる場合があります。一般的なサイト情報すべてに使用されるデータベースが 1 つあり、ミッションクリティカルなデータに使用される別のデータベースがある場合があります。

マイグレーションの `$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()
    {
        // ...
    }
}

注意

既に実行されたマイグレーションを追跡する **migrations** テーブルは、常にデフォルトのデータベースグループに作成されます。

名前空間

マイグレーションライブラリは、**app/Config/Autoload.php** 内に定義されているか、Composer などの外部ソースからロードされているすべての名前空間を、ディレクトリ名と一致させるために `$psr4` プロパティを使用して自動的にスキャンできます。 **Database/Migrations** にあるすべてのマイグレーションが含まれます。

各名前空間には独自のバージョンシーケンスがあり、これにより、他の名前空間に影響を与えることなく、各モジュール(名前空間)をアップグレードおよびダウングレードできます。

たとえば、自動ロード設定ファイルに次の名前空間が定義されているとします。

<?php

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

これは、**APPPATH/Database/Migrations** と **ROOTPATH/MyCompany/Database/Migrations** の両方にあるマイグレーションを検索します。これにより、再利用可能なモジュール式コードスイートにマイグレーションを簡単に含めることができます。

コマンドラインツール

CodeIgniter には、コマンドラインから使用できるいくつかの コマンド が付属しており、マイグレーションの操作に役立ちます。これらのツールは、それらを使用したい人にとって物事を容易にします。ツールは、主に MigrationRunner クラス内で使用可能なメソッドと同じメソッドへのアクセスを提供します。

migrate

利用可能なすべてのマイグレーションを使用してデータベースグループを移行します

php spark migrate

次のオプションを付けて (migrate) を使用できます

  • `-g` - データベースグループを指定します。指定した場合、指定されたデータベースグループのマイグレーションのみが実行されます。指定しない場合、すべてのマイグレーションが実行されます。

  • `-n` - 名前空間を選択するため。そうでない場合、`App` 名前空間が使用されます。

  • `--all` - すべての名前空間を最新のマイグレーションに移行するため。

この例では、テストデータベースグループの新しいマイグレーションを使用して `Acme\Blog` 名前空間を移行します

Unix の場合

php spark migrate -g test -n Acme\\Blog

Windows の場合

php spark migrate -g test -n Acme\Blog

`--all` オプションを使用すると、すべての名前空間をスキャンして、実行されていないマイグレーションを探します。これらはすべて収集され、作成日別にグループとしてソートされます。これは、メインアプリケーションとモジュール間の潜在的な競合を最小限に抑えるのに役立ちます。

rollback

すべての移行をブランク状態(事実上移行0)にロールバックします

php spark migrate:rollback

次のオプションを付けて (rollback) を使用できます

  • `-b` - バッチを選択するため。自然数はバッチを指定します。

  • `-f` - 確認の質問を強制的にバイパスするため。本番環境でのみ質問されます。

refresh

最初にすべてのマイグレーションをロールバックしてから、すべてを移行することにより、データベースの状態を更新します

php spark migrate:refresh

次のオプションを付けて (refresh) を使用できます

  • `-g` - データベースグループを指定します。指定した場合、指定されたデータベースグループのマイグレーションのみが実行されます。指定しない場合、すべてのマイグレーションが実行されます。

  • `-n` - 名前空間を選択するため。そうでない場合、`App` 名前空間が使用されます。

  • `--all` - すべての名前空間を更新するため。

  • `-f` - 確認の質問を強制的にバイパスするため。本番環境でのみ質問されます。

status

すべての実行済みマイグレーションのリストと、それらが実行された日時を表示します。実行されていない場合は「–」と表示されます。

php spark migrate:status

...

+----------------------+-------------------+-----------------------+---------+---------------------+-------+
| Namespace            | Version           | Filename              | Group   | Migrated On         | Batch |
+----------------------+-------------------+-----------------------+---------+---------------------+-------+
| App                  | 2022-04-06-234508 | CreateCiSessionsTable | default | 2022-04-06 18:45:14 | 2     |
| CodeIgniter\Settings | 2021-07-04-041948 | CreateSettingsTable   | default | 2022-04-06 01:23:08 | 1     |
| CodeIgniter\Settings | 2021-11-14-143905 | AddContextColumn      | default | 2022-04-06 01:23:08 | 1     |
+----------------------+-------------------+-----------------------+---------+---------------------+-------+

(status) は、以下のオプションと共に使用できます。

  • -g - データベースグループを指定します。指定した場合、指定されたデータベースグループのマイグレーションのみがチェックされます。指定しない場合は、すべてのマイグレーションがチェックされます。

make:migration

**app/Database/Migrations** にスケルトンマイグレーションファイルを作成します。現在のタイムスタンプが自動的に先頭に付加されます。作成されるクラス名は、ファイル名のパスカルケースバージョンです。

php spark make:migration <class> [options]

(make:migration) は、以下のオプションと共に使用できます。

  • --namespace - ルート名前空間を設定します。デフォルト: APP_NAMESPACE.

  • --suffix - コンポーネントのタイトルをクラス名に追加します。

データベースセッション用のマイグレーションファイルを生成するために、以下のオプションも使用できます。

  • --session - データベースセッション用のマイグレーションファイルを生成します。

  • --table - データベースセッションに使用するテーブル名。デフォルト: ci_sessions.

  • --dbgroup - データベースセッションに使用するデータベースグループ。デフォルト: default.

マイグレーション設定

以下は、**app/Config/Migrations.php** で使用可能な、マイグレーションのすべての設定オプションの表です。

設定項目

デフォルト値

オプション

説明

enabled

true

true / false

マイグレーションを有効または無効にします。

table

migrations

なし

スキーマバージョン番号を格納するためのテーブル名。このテーブルは常にデフォルトのデータベースグループ ($defaultGroup) に作成されます。

timestampFormat

Y-m-d-His_

マイグレーションの作成時にタイムスタンプに使用する形式。

クラスリファレンス

class CodeIgniter\Database\MigrationRunner
findMigrations()
戻り値:

マイグレーションファイルの配列

戻り値の型:

array

path プロパティで見つかったマイグレーションファイル名の配列が返されます。

latest($group)
パラメータ:
  • **$group** (mixed) – データベースグループ名。null の場合はデフォルトのデータベースグループが使用されます。

戻り値:

成功時は true、失敗時は false

戻り値の型:

bool

これは、名前空間(またはすべての名前空間)のマイグレーションを特定し、まだ実行されていないマイグレーションを判別し、バージョン順に実行します(名前空間は混在します)。

regress($targetBatch, $group)
パラメータ:
  • **$targetBatch** (int) – ダウングレードする以前のバッチ。1+ はバッチを指定し、0 はすべてを元に戻し、負の値は相対バッチを指します(例:-3 は「3 バッチ戻る」を意味します)。

  • **$group** (?string) – データベースグループ名。null の場合はデフォルトのデータベースグループが使用されます。

戻り値:

成功時は true、失敗時またはマイグレーションが見つからない場合は false

戻り値の型:

bool

Regress は、変更をバッチごとに以前の状態にロールバックするために使用できます。

<?php

$migration->regress(5);
$migration->regress(-1);
force($path, $namespace, $group)
パラメータ:
  • **$path** (mixed) – 有効なマイグレーションファイルへのパス。

  • **$namespace** (mixed) – 提供されたマイグレーションの名前空間。

  • **$group** (mixed) – データベースグループ名。null の場合はデフォルトのデータベースグループが使用されます。

戻り値:

成功時は true、失敗時は false

戻り値の型:

bool

これは、順序やバッチに関係なく、単一のファイルを強制的にマイグレートします。メソッド up() または down() は、既にマイグレートされているかどうかによって検出されます。

注意

このメソッドはテストのみに推奨され、データの整合性問題を引き起こす可能性があります。

setNamespace($namespace)
パラメータ:
  • **$namespace** (string|null) – アプリケーションの名前空間。null はすべての名前空間です。

戻り値:

現在の MigrationRunner インスタンス

戻り値の型:

CodeIgniter\Database\MigrationRunner

ライブラリがマイグレーションファイルを検索する名前空間を設定します。

<?php

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

注意

null を設定すると、すべての名前空間でマイグレーションファイルが検索されます。

setGroup($group)
パラメータ:
  • **$group** (string) – データベースグループ名。

戻り値:

現在の MigrationRunner インスタンス

戻り値の型:

CodeIgniter\Database\MigrationRunner

ライブラリがマイグレーションファイルを検索するグループを設定します。

<?php

$migration->setGroup($group)->latest();