Yiiのデータベースの移行

私たちの開発プログラムの過程では、データベースの構造が絶えず調整されています。私たちの開発者は、同期コードとデータベース・リポジトリーを確保したいです。私たちは、アプリケーションデータベースなしで行うことはできませんので。たとえば:開発プロセスの間に、私たちは多くの場合、新しいテーブルを追加する必要がある、または私たちは後半の製品での動作に入れて、あなたは列にインデックスを追加する必要があるかもしれません。私たちは、データ構造とコードの整合性を維持しなければなりません。コードとデータベースが同期していない場合、システムが適切に機能しないことがあります。このため。Yiiはコードを維持することができますし、データベースが同期されているデータベース移行ツールを提供します。簡単にロールバックし、データベースを更新します。

次の手順では、我々は、開発プロセス中にデータベースの移行を使用する方法を示しています。

 

  1. ティムは(たとえば、新しいテーブルを作成する)新しいタスクを作成するために移動しました
  2. 制御システム(例えば、SVN、GIT)への新しい移行元の提出後
  3. ダグは、ソースコード管理システムからソースコードを更新し、新しい移行を受信します
  4. 彼のローカル開発データベースへのダグ・アプリケーションの移行

注意:  使用yiic移行コマンドを、好ましくは指定したアプリケーションディレクトリに切り替えます(例:cdパスは/ /保護するために ) の代わりに、ルートディレクトリ内のフレームの。

1.作成移行は、移行を作成します

新しい移行(例えばニュースのテーブルを作成します)を作成するために、我々は、次のコマンドを実行します。

yiic migrate create <name>

 nameパラメータを指定し、移行して(例えばcreate_news_table)非常に簡単な説明を行う必要があります。私たちの例として、nameパラメータので、PHPのクラス名の一部として使用されます。したがって、それだけで、文字、数字、および/またはアンダースコア文字を含める必要があります。

yiic migrate create create_news_table

上記のコマンドは、以下の初期のコードが含まれてnamedm101129_185401_create_news_table.php保護/移行ディレクトリに新しいファイルを作成します。

class m101129_185401_create_news_table extends CDbMigration
{
    public function up()
    {
    }
 
    public function down()
    {
        echo "m101129_185401_create_news_table does not support migration down.\n";
        return false;
    }
 
    /*
    // implement safeUp/safeDown instead if transaction is needed
    public function safeUp()
    {
    }
 
    public function safeDown()
    {
    }
    */
}

マイグレーションファイル名フォーマットを作成するようなクラス名は、<タイムスタンプ> UTCタイムスタンプ(yymmdd_hhmmss形式)を参照し、<名前>パラメータはコマンドで指定され、M <タイムスタンプ> _ <名>である場合、なお。

 最大()メソッドは、実際のデータベース移行の実装コードが含まれている必要があり、ダウン()メソッドは、(最大で)コードをロールバックします。

時々、ダウン()は、特定のコードを指定しないでください。我々は、テーブルのアップ()内の行を削除した場合、我々は戻って操作ロールアップされることはありません。この場合、移行は、我々はデータベースの以前の状態にロールバックすることはできませんつまり、不可逆的と呼ばれています。生成されたコードで、最大()メソッドは、偽の移行を復元できないことを示し返します。

インフォメーション:  上下(場合、バージョン1.1.7以降で)または()メソッドは、移行がキャンセルされたことを示し、falseを返します。バージョン1.1.6より前、例外は、移行をキャンセルスローされます。

例としては、ニュースの移行を作成するための表で説明されています。

class m101129_185401_create_news_table extends CDbMigration
{
    public function up()
    {
        $this->createTable('tbl_news', array(
            'id' => 'pk',
            'title' => 'string NOT NULL',
            'content' => 'text',
        ));
    }
 
    public function down()
    {
        $this->dropTable('tbl_news');
    }
}

CDbMigrationベースクラスデータ構造とデータベースを操作するための方法を提供します。例えば、CDbMigration ::のcreateTableは、データベーステーブルを作成し、そしてCDbMigration ::インサートは、行を挿入します。これらの方法はCDbMigration :: getDbConnection()は、データベース接続を取得し使用し、デフォルトではYiiの::アプリを()を返す - >デシベル

情報:  あなたはCDbMigrationデータベースとCDbCommand非常に似により提供気付くかもしれ方法。CDbMigrationメソッドは、メソッドのパラメータに関するいくつかの情報を印刷するのに使用される時間と方法を印刷します除き実際に、彼らは、ほとんど同じです。

2.トランザクションの移行移行総務

情報:  バージョン1.1.7のサポートトランザクションの移行。

複雑なデータベースの移行を実行中に、データベースの一貫性と整合性ように、我々は通常、全体の移行の成功または失敗を確認します。この目標を達成するために、我々は、トランザクションデータベースを使用することができます。

:私たちは、明らかなように、起動操作コード関連データのDBの業務と業務を指定する必要があります

class m101129_185401_create_news_table extends CDbMigration
{
    public function up()
    {
        $transaction=$this->getDbConnection()->beginTransaction();
        try
        {
            $this->createTable('tbl_news', array(
                'id' => 'pk',
                'title' => 'string NOT NULL',
                'content' => 'text',
            ));
            $transaction->commit();
        }
        catch(Exception $e)
        {
            echo "Exception: ".$e->getMessage()."\n";
            $transaction->rollback();
            return false;
        }
    }
 
    // ...similar code for down()
}

トランザクションサポートを入手する簡単な方法は、safeUp()メソッドの代わりにアップ()、safeDown()の代わりに、ダウンを使用することです()。たとえば、

class m101129_185401_create_news_table extends CDbMigration
{
    public function safeUp()
    {
        $this->createTable('tbl_news', array(
            'id' => 'pk',
            'title' => 'string NOT NULL',
            'content' => 'text',
        ));
    }
 
    public function safeDown()
    {
        $this->dropTable('tbl_news');
    }
}

移行のYiiの時には、データベースのトランザクションを開始し、その後safeUp()またはsafeDown()を呼び出します。任意のDBエラーsafeUp()またはsafeDown()場合は、データベースの整合性を確保するために、トランザクションをロールバックします。

注意:  必ずしもすべてのDBMSをサポート取引。いくつかのデータベースクエリは、トランザクションに配置することはできません。この場合は、あなたがダウン(アップ使用)とする必要があります()。MySQLは、いくつかのSQL文は、暗黙的なコミットを引き起こす可能性があります。

3.適用の移行アプリケーションの移行

利用可能なすべての新しい移行を適用します(たとえば、最新のローカルデータベース)は、次のコマンドを実行します。

yiic migrate

このコマンドは、すべての新しい移行の一覧を表示します。それは、マイグレーションを実行するために()メソッドを実行することを、アプリケーションの移行を確認した場合、注文は、注文のタイムスタンプ値のクラス名に従って実行されます。

アプリケーションの移行では、移行ツールはtbl_migrationと呼ばれるデータベーステーブルにレコードを保持します。これは、ツールを作る、あなたは移行が適用されていることを確認することができます。tbl_migrationが存在しない場合は、ツールが自動的にDBアプリケーションでそれを作成するデータベースを指定します

時々、私たちは、1つまたはいくつかの新しいマイグレーションを適用する必要があるかもしれません。私たちは、次のコマンドを使用できます。

yiic migrate up 3

このコマンドは、3つの新しいマイグレーションを適用します。3の値を変更することにより、それは私たちが移行されたアプリケーションの数を変更することができます。

また、データベースの特定のバージョンに移行するには、次のコマンドを使用することができます。

yiic migrate to 101129_185401

言い換えれば、我々は我々が移行するデータベースのバージョンを指定するには、移行名+タイムスタンプセクションを使用することができます。そのような移行と移行を指定された最後のアプリケーションなど、複数の移行がある場合。これらのすべてのマイグレーションが適用されます。最後マイグレーションの最初のアプリケーションは、その後、(に記載される)指定の移行をロールバックします。

移行を減らす4.元に戻す移行

過去1つ以上のアプリケーションを移行復元するには、我々は、次のコマンドを使用することができます。

yiic migrate down [step]

オプションのステップパラメータは、多くの回復を移行する方法を指定します。デフォルト値は、前回の移行をロールバックすることを意味し、1です。

我々は先に述べたように、すべてではないの移行をロールバックすることができます。そのような移行をロールバックしようとすると例外をスローし、全体の回復プロセスを停止します。

5.やり直し移行 

最初の回復を意味するの移行をやり直し、その後、指定された移行を適用します。あなたは、次のコマンドを使用することができます。

yiic migrate redo [step]

オプションのステップパラメータは、REDOの移行の数を指定します。デフォルト値は、最後の移行をやり直す意味し、1です。

移行情報の表示6.移行情報を表示します

回復と移行用途に加えて、それはまた、新しい移行歴史やアプリケーションの移行を表示することができます。

yiic migrate history [limit]
yiic migrate new [limit]

その中でも、オプションのパラメータが表示される限度の移行を指定します。何も指定された制限がない場合、それはすべての利用可能な移行が表示されます。

最初のコマンドは、移行が適用された表示され、2番目のコマンドは、マイグレーションが適用されていない表示します。

7.変更の移行の歴史 

時々、私たちは、移民のレコードを修正する必要があり、実用的なアプリケーションが存在しない場合に通常発生するか、特定のバージョンへの移行については、復元したり、新しい移行タスクの開発に移行することがあります。私たちは、次のコマンドを使用することができます。

yiic migrate mark 101129_185401

このコマンドとyiic移行コマンドは、それが唯一の指定されたバージョンを復元するために、何のアプリケーションの移行または移行を履歴テーブルを変更することはできませんことを除いて、非常によく似ています。

8.カスタマイズマイグレーションコマンドマイグレーション・コマンドをカスタマイズします

移行コマンドをカスタマイズする方法はいくつかあります。

コマンドラインオプションコマンドラインオプションを使用します

コマンドラインでの移行コマンドでは、次の4つのオプションを使用することができます。

  • interactive:ブールは、移行の対話モードを実行するかどうかを指定します。デフォルトでは、特定の移行を実行する場合、ユーザーがプロンプトが表示されますことを意味し、真です。あなたは、バックグラウンド・プロセスの移行を行う必要がfalseに設定することができます

  • migrationPath:文字列は、すべてのマイグレーションクラスファイルを格納するディレクトリを指定します。あなたは、別名を指定する必要があり、対応するパスが存在している必要があります。指定しない場合、そのアプリケーションを使用して、ルート・パスの下のサブディレクトリthemigrationsます

  • migrationTable:文字列は,,移動履歴情報を格納するデータベーステーブルの名前を指定します。デフォルトtbl_migration。テーブルの構造のバージョンは、VARCHAR(255)主キー、apply_time整数です。

  • connectionID:ID列、指定されたデータベース・アプリケーション・コンポーネント。デフォルトでは「DB」です。

  • templateFile:文字列、ファイルへのパスを指定し、クラスの移行のためのコードを生成するためのテンプレートを務めました。あなたは(例えばapplication.migrations.template)パスのエイリアスを指定する必要があります。設定されていない場合は、内部のテンプレートが使用されます。テンプレートでは、マーカー{クラス名}マイグレーションクラスの実際の名前に置き換えられます。

例としては、次のとおりです

yiic migrate up --option1=value1 --option2=value2 ...

例えば、我々はフォーラムのモジュールを移行する場合、移行ファイルがモジュールの移行ディレクトリ内に配置され、我々は次のコマンドを使用することができます。

yiic migrate up --migrationPath=ext.forum.migrations

コマンドグローバルグローバルコンフィギュレーションコマンドを設定します

コマンドラインオプションは、私たちは、移行コマンドを設定することができますが、時には我々は、すべてのコマンドを設定するには時間が必要な場合があります。例えば、我々は、移行の履歴を保存するために別のテーブルを使用したい場合があり、あるいは我々は、カスタマイズされた移行テンプレートを使用することをお勧めします。私たちは、次のコンソールアプリケーションと同様の構成ファイルを変更することができます

return array(
    ......
    'commandMap'=>array(
        'migrate'=>array(
            'class'=>'system.cli.commands.MigrateCommand',
            'migrationPath'=>'application.migrations',
            'migrationTable'=>'tbl_migration',
            'connectionID'=>'db',
            'templateFile'=>'application.migrations.template',
        ),
        ......
    ),
    ......
);

私たちは、migrateコマンドを実行した場合さて、上記の構成は、各設定を必要とせずに有効に存続します。

 

 

 

 

 

コマンドラインを使用して、データベースの移行..行うには、コンソール/アプリケーションであります

 だから、コンソールのconfig /の設定を変更するには...

'components.db' => [
'クラス' => 'Yiiの\ DB \接続'、
'DSN' => 'mysqlの:ホスト= localhostの; DBNAME =テスト'、
'ユーザ名' => 'ルート'、
'パスワード' => '******'
]

 

  • php yii migrate --migrationPath=@vendor/amnah/yii2-user/amnah/yii2/user/migrations

ます。https://my.oschina.net/zhepama/blog/265037で再現

おすすめ

転載: blog.csdn.net/weixin_33940102/article/details/91927345