ホームページ > バックエンド開発 > PHPチュートリアル > はしごの移行によるデータベースバージョン化

はしごの移行によるデータベースバージョン化

Jennifer Aniston
リリース: 2025-02-21 10:30:09
オリジナル
816 人が閲覧しました

Database Versioning with Ladder Migrations

コアポイント

  • Ladderは、アプリケーションコードと同じ方法でデータベーススキーマの変更を追跡できるように、データベース移行を作成、実行、および管理するためのツールです。このツールは、任意の主要なフレームワークに統合でき、バージョン制御の変更と機能管理に使用できます。
  • 移行は常に順番に実行され、ラダーは順番に移行を数え、データベース自体で実行された移行の記録を保存することでこれを保証し、以前の移行の再実行を妨げます。
  • Ladderでは、デフォルトのユーザーアカウントなど、事前入力または「シード」データベースを作成することもできます。これは、LadderのKeyvalueストアを使用して行うことができ、後で参照するためにいくつかのデータを保存します。
  • このツールは、データベース状態のステータスコマンド、データベース状態をダンプおよび復元するためのdiffおよびdiff-saveコマンド、および使用されるラダーのバージョンをチェックするためのバージョンコマンドなど、データベースを管理および監視するための追加のコマンドを提供します。

バージョン制御システムは、特にチームで作業する場合、コードの変更を追跡するために非常に貴重です。ただし、ほとんどのアプリケーションには、アプリケーションコード以上のものが含まれています。特に、パターンを変更する必要がある新しい機能を追加する場合、データベースの変更を管理することはより困難です。

モジュールで作業していると仮定し、データベーステーブルには追加の列が必要であることを認識してください。データベースクエリツールまたはコマンドラインを開き、その列を追加するだけです。ただし、これはバージョン制御アプリケーションコードのような変更の記録を残しません。これは、チームで作業するときに悪化する可能性があります。同僚が同じデータベースアップデートを実行せずにコードを変更すると、アプリケーションバージョンがクラッシュする可能性があります。これは、製品の更新をリリースするとさらに問題が発生します。これにより、同僚だけでなくユーザーにとってアプリが破損する可能性があるためです。

ソリューションの1つは、移行を使用して、データベーススキーマをコードに作成および変更する責任を転送することです。このようにして、変更はアプリケーションの残りの部分と一緒に管理でき、バージョン制御(バージョンを比較して監査証跡を維持できるなど)に慣れている機能を使用して、データベースの変更を処理できます。また、これらの変更を同じブランチまたはタグの一部にすることができるため、これらの変更をバージョンにシームレスに統合できます。

多くの主要なフレームワークには独自の移行実装がありますが、そうでない場合は、使用しない場合は、はしごを使用できます。

はしご紹介

Ladderは、データベースの移行を作成、実行、および管理するためのツールです。移行は単なるPHPクラスであるため、バージョン制御をアプリケーションの残りのコードでチェックインできます。

単一の移行でスキーマに多くの変更を加えることができますが、単一のテーブルまたは機能に移行を制限するのが最善です。

移行は常に順番に実行されます。したがって、数週間後に製品テーブルを作成して新しい移行を作成して、追加の列を追加して新しい移行を作成するとします。後者の前に前者を実行しようとすると、エラーが発生します。 Ladderは、移行に順番に移行し、データベース自体に移行を実行する記録(および時間)を保存することにより、この問題を解決します。

インストール

はしごは、BitbucketまたはComposerからダウンロードできます。ただし、起きて実行するにはいくつかのステップが必要です。

最も簡単な方法は(エレガントではないことを認めていますが)、プロジェクトルートからダウンロードまたはクローンを作成し、Ladderと呼ばれるディレクトリに配置することです。 Composerの使用に関する問題は、Composer Updateの実行が構成ファイルを上書きすることです。

5つの構成ファイルがあり、それぞれが手動で作成する必要があります。

cp ladder/config/config.php.example ladder/config/config.php
cp ladder/config/database.php.example ladder/config/database.php
cp ladder/config/diff.php.example ladder/config/diff.php
cp ladder/config/editor.php.example ladder/config/editor.php
cp ladder/config/table.php.example ladder/config/table.php
ログイン後にコピー
ログイン後にコピー
database.php(データベース接続の詳細を含む)とeditor.phpを変更するだけで、希望するテキストエディターを指定し、作成時に新しい移行を自動的に開くことができます。

移行を作成

移行を作成してユーザーテーブルを作成することから始めましょう。

コマンドラインについて

これにより、Ladder/Migrations/00001_Create_Users_Tableという名前のファイルが作成されます。これには、コメントが発生したコメントの例がある基本構造が含まれています。 Ladder/config/editor.phpでauto-editをtrueに設定した場合、このファイルは指定されたテキストエディターですぐに開かれます。自由に移行を呼び出すことはできますが、一目でファイル名から移行が何をするかを見ることができると役立ちます。
php ladder/ladder.php create create_users_table
ログイン後にコピー
ログイン後にコピー

ここにファイルがどのように見えるか(明確にするためにコメントされたコードの行を削除しました):

移行が実行されたときにUP()メソッドを呼び、移行が巻かれたときのDown()メソッドを呼び出します。したがって、UP()メソッドとは逆の操作を常に実行する必要があります。この例では、up()メソッドはユーザーという名前のテーブルを作成し、down()メソッドは削除します。
class Create_Users_Table_Migration_00001 extends Migration {
    protected $min_version = '0.8.1';

    public function up() {
        $this->create_table('users')
            ->column('email', 'varchar', array('limit' => 128, 'null' => FALSE))
            ->column('password', 'varchar', array('limit' => 32, 'null' => FALSE));
    }

    public function down() {
        $this->table('users')->drop();
    }   
}
ログイン後にコピー
ログイン後にコピー

create_table()メソッドは新しいテーブルへの参照を返しますが、テーブルクラスには新しい列を追加する列()メソッドがあります。スムーズなインターフェイスがあるため、それらをリンクして複数の列を同時に作成できます。 ID列がないことに気付くでしょう - これは自動的に作成されます - つまり、IDという名前の自動インクラメント整数プライマリキーです。

table()テーブルへの参照を返しますが、テーブルがまだ存在しない場合はテーブルも作成します。

別の移行を作成しましょう。今回は役割を作成しますテーブル:

ファイル自体:

php ladder/ladder.php create create_roles_table
ログイン後にコピー
ログイン後にコピー

ここで、実際に移行を実行する必要があります。これを行うには:

class Create_Roles_Table_Migration_00002 extends Migration {
    protected $min_version = '0.8.1';

    public function up() {
        $this->table('roles')
            ->column('nme', 'varchar', array('limit' => 128, 'null' => FALSE));            
    }

    public function down() {
        $this->table('roles')->drop();
    }   
}
ログイン後にコピー
ログイン後にコピー

データベースを見ると、4つのテーブルがあります。

移行は自動的に作成され、どの移行が実行されたかを追跡する Migrations_kvdataも作成され、移行はキー価値ストレージに使用できます ユーザーと役割は、追加したテーブルです。
php ladder/ladder.php migrate
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ただし、役割の移行に細心の注意を払うと、名前の代わりにNMEと呼ばれる列が作成されることに気付くでしょう。この時点で、これを修正して、移行を「元に戻す」ことで、クラスを変更し、再度実行することができます。移行をロールバックするには:

cp ladder/config/config.php.example ladder/config/config.php
cp ladder/config/database.php.example ladder/config/database.php
cp ladder/config/diff.php.example ladder/config/diff.php
cp ladder/config/editor.php.example ladder/config/editor.php
cp ladder/config/table.php.example ladder/config/table.php
ログイン後にコピー
ログイン後にコピー
番号2は、移動が戻ってくることを示しています。これは、主要なゼロなしで、移行ファイル名の接頭辞です。

今、あなたは単に修正を行い、再び移行を実行することができます:

php ladder/ladder.php create create_users_table
ログイン後にコピー
ログイン後にコピー
移行テーブルには、ランニングコンテンツとUNRUNコンテンツの記録が保存されているため、最初の移行が再実行されることを心配する必要はありません。

再適用を使用するより速い方法もあります:

class Create_Users_Table_Migration_00001 extends Migration {
    protected $min_version = '0.8.1';

    public function up() {
        $this->create_table('users')
            ->column('email', 'varchar', array('limit' => 128, 'null' => FALSE))
            ->column('password', 'varchar', array('limit' => 32, 'null' => FALSE));
    }

    public function down() {
        $this->table('users')->drop();
    }   
}
ログイン後にコピー
ログイン後にコピー
これにより、2番目のMigration's Down()メソッドを一度に呼び出し、その後UP()メソッドを呼び出します。

しばらくして、ユーザーテーブルにステータスフィールドを含める必要がある新しい機能を開発します。これを行うには、新しい移行を作成する必要があります。

移行は次のようになります:
php ladder/ladder.php create create_roles_table
ログイン後にコピー
ログイン後にコピー

前と同様に、次のコマンドで実行してください:
class Create_Roles_Table_Migration_00002 extends Migration {
    protected $min_version = '0.8.1';

    public function up() {
        $this->table('roles')
            ->column('nme', 'varchar', array('limit' => 128, 'null' => FALSE));            
    }

    public function down() {
        $this->table('roles')->drop();
    }   
}
ログイン後にコピー
ログイン後にコピー

ここで、データベースを確認すると、ユーザーテーブルに新しい列があることがわかります。
php ladder/ladder.php migrate
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

データベースシード

データベーススキーマを管理するための移行の記述に加えて、はしごを使用してデータベースを事前に入力する(つまり、シード)データベースを使用することもできます。

たとえば、

create_users_table移行を拡張してデフォルトのルートユーザーアカウントを作成できます。

set()およびget()メソッドを使用して、LadderのKeyvalueストアを利用して、後で参照できるようにユーザーIDを保存していることに注意してください。

php ladder/ladder.php remove 2
ログイン後にコピー
移行されたCSVファイルからデータをインポートすることもできます。たとえば、

csvデータを挿入する代わりに更新するには、これを行うことができます:

php ladder/ladder.php migrate
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

この場合、送信パラメーターは更新を実行することを意味し、3番目のパラメーターには、更新するレコードを決定するためのキーフィールドのリストが含まれています。

php ladder/ladder.php reapply 2
ログイン後にコピー

他のデータベースを追加

デフォルトのデータベースファイルラダー/config/database.phpは、おそらくステージングまたはリアルタイムのデータベースを追加する方法を示しています。たとえば、

このように使用する接続を指定できます:

php ladder/ladder.php create add_status_to_users_table
ログイン後にコピー

その他のコマンド
class Add_Status_To_Users_Table_Migration_00003 extends Migration {
    protected $min_version = '0.8.1';

    public function up() {
        $this->table('users')
            ->column('status', 'integer', array('null' => FALSE, 'default' => 0));            
    }

    public function down() {
        $this->table('users')->drop_column('status');      
    }
}
ログイン後にコピー

status

ステータスコマンドを使用してデータベースステータスを取得できます。

例の出力:(元のドキュメントが特定の出力コンテンツを提供していないため、出力の例はここでは省略されています)

php ladder/ladder.php migrate
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
diffとdiff-save (これらのコマンドが元のドキュメントで詳細に説明されているため、diffとdiff-saveコマンドの説明はここで省略されています)

バージョン

(バージョンのコマンドの説明は、元のドキュメントで詳細に説明されているため、ここでは省略されています)

概要

この記事では、データベーススキーマと事前入力データを維持するために使用されるラダーを紹介します。 (元のドキュメントには梯子が要約されているため、概要部分はここで省略されています)

データベースバージョンのバージョンとはしごの移行に関するFAQ

(FAQセクションはここでは省略されています。元のドキュメントはすでに詳細なFAQを提供しているため)

以上がはしごの移行によるデータベースバージョン化の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート