ホームページ >バックエンド開発 >PHPチュートリアル >Yii のスピリチュアル修行への道 (1) @Migration データ移行

Yii のスピリチュアル修行への道 (1) @Migration データ移行

WBOY
WBOYオリジナル
2016-06-23 13:03:29794ブラウズ

簡単な説明

データ移行とは、チームビルディングにおけるデータベーステーブルの移行操作で、チーム間の情報同期とデータの統合を実現します。

データベース移行

一般的な手順:

1. yii2 の移行では、通常、主に構造とデータの小さな部分を操作するために使用されます (比較的大規模なデータの場合、大きなデータはめったに発生しません)。データ量、データテーブルの直接エクスポートとインポートが使用されます)。

2. バックエンドはステートメントを実行します: ./yii merge/create

3. バックエンドが移行コマンドを実行すると、次のスクリプトが生成されます。主に SQL を保存するために使用されます。ステートメントは、他のメンバーがデータベースを同期して実際のデータ移行を実現するためにコード リリースとともにアップロードされます。

4. 他のメンバーが最新のコードをローカルにプルバックした後、./yii merge を実行してデータ移行ステータスを更新し、最新のデータ移行をローカルに同期します。

概念

データベース駆動型アプリケーションを開発および保守する場合、コードが変更されるとデータベースの構造も変わります。

たとえば、アプリケーションの開発中に新しいテーブルが追加されるため、追加する必要があります。アプリケーションが運用環境にデプロイされた後は、クエリのパフォーマンスを向上させるためにインデックスを確立する必要があります。 データベースの構造が変更されるとソースコードの変更が必要になることが多いため、Yii はデータベースの変更を記録できるデータベース移行機能を提供し、データベースとソースコードの両方がバージョン管理されるようにします。

次の手順は、開発チームがデータベース移行ツールをどのように使用するかを示しています:

  1. Tim は、新しい移行オブジェクトを作成します (たとえば、新しいフォームの作成、フィールドの定義の変更など)。

  2. Tim は、この新しい移行オブジェクトをコード管理システム (Git、Mercurial など) に送信します。

  3. Doug は、コード管理システムからバージョンを更新し、この新しい移行オブジェクトを取得します。

  4. Doug は移行オブジェクトをローカル開発データベースに送信します。このようにして、Doug は Tim によって加えられた変更を同期します。

次の手順は、データベース移行を含む新しいバージョンを運用環境にリリースする方法を示しています。

  1. Scott は、データベース移行を含むプロジェクト バージョンのリリース タグを作成します。

  2. Scott は、リリース タグのソース コードを運用サーバーに更新します。

  3. Scott は、すべての増分データベース移行を実稼働環境データベースに送信します。

Yii は移行コマンド ライン ツールの完全なセットを提供しており、これにより次のことが可能になります。

  • 新しい移行を作成します (./yii merge/create migration description)。

  • 移行を送信します。

    移行を再開します。

  • 移行を再送信します。

  • 現実的な移行履歴とステータス。

  • これらのツールはすべて、yii merge コマンドを通じて操作できます。注: 移行はデータベース テーブルに影響を与えるだけでなく、新しいフォームに合わせて既存のデータを調整したり、RBAC レイヤーを作成したり、キャッシュをクリアしたりすることもできます。

  • 移行を作成する

次のコマンドを使用して新しい移行を作成します:

yii migrate/create <name>

必須パラメータ名の役割は、新しい移行の簡単な説明を与えることです。

たとえば、この移行を使用して news という名前のフォームを作成する場合、create_news_table という名前を使用して次のコマンドを実行できます:

yii migrate/create create_news_table

注: name パラメーターは移行のクラス名の一部を生成するために使用されるためです。 , したがって、パラメータには文字、数字、アンダースコアのみを含める必要があります。

上記のコマンドは、m150101_185401_create_news_table.php という名前の新しい PHP クラス ファイルを @app/migrations ディレクトリに作成します。

このファイルには、コード スケルトンとともに移行クラス m150101_185401_create_news_table を宣言するために使用される次のコードが含まれています:

<?php use yii\db\Schema; use yii\db\Migration; class m150101_185401_create_news_table extends Migration{     public function up() {         }     public function down() {         echo "m101129_185401_create_news_table cannot be reverted.\n"; return false;     } }

各データベース移行は、yiidbMigration から継承された PHP クラスとして定義されます。クラスの名前は、m3f41681be24f336d7c374e431294cbbd_af0c92e9f9d1400e4fba6230747949fe の形式で自動的に生成されます。ここで、

3f41681be24f336d7c374e431294cbbd は、移行作成コマンドが実行されるときの UTC 時間を指します。

  • af0c92e9f9d1400e4fba6230747949fe はコマンド実行時の name パラメータの値と同じです。

  • 移行クラスでは、up() メソッドでデータベース構造を変更するコードを記述する必要があります。 up() メソッドによって加えられた変更を元に戻すために、down() メソッドにコードを記述する必要がある場合もあります。

    当你通过 migration 升级数据库时, up() 方法将会被调用,反之, down() 将会被调用。如下代码展示了如何通过迁移类来创建一张 news 表:

    use yii\db\Schema; use yii\db\Migration; class m150101_185401_create_news_table extends \yii\db\Migration{     public function up() {         $this->createTable('news', [ 'id' => Schema::TYPE_PK, 'title' => Schema::TYPE_STRING . ' NOT NULL', 'content' => Schema::TYPE_TEXT, ]);     }     public function down() {         $this->dropTable('news');     } }

    注意:并不是所有迁移都是可恢复的。

    例如,如果 up() 方法删除了表中的一行数据,这将无法通过 down() 方法来恢复这条数据。有时候,你也许只是懒得去执行 down() 方法了,因为它在恢复数据库迁移方面并不是那么的通用。在这种情况下,你应当在 down() 方法中返回 false 来表明这个 migration 是无法恢复的。

    提交迁移

    为了将数据库升级到最新的结构,你应该使用如下命令来提交所有新的迁移:

    yii migrate

    这条命令会列出迄今为止所有未提交的迁移。

    如果你确定你需要提交这些迁移,它将会按照类名当中的时间戳的顺序,一个接着一个的运行每个新的迁移类里面的 up() 或者是 safeUp() 方法。如果其中任意一个迁移提交失败了,那么这条命令将会退出并停止剩下的那些还未执行的迁移。

    对于每一个成功提交的迁移,这条命令都会在一个叫做 migration 的数据库表中插入一条包含应用程序成功提交迁移的记录,该记录将帮助迁移工具判断哪些迁移已经提交, 哪些还没有提交。

    提示:迁移工具将会自动在数据库当中创建 migration 表,该数据库是在该命令的 yiiconsolecontrollersMigrateController::db 选项当中指定的。默认情况下,是由 db application component 指定的。

    有时,你可能只需要提交一个或者少数的几个迁移,你可以使用该命令指定需要执行的条数,而不是执行所有的可用迁移。例如,如下命令将会尝试提交前三个可用的迁移:

    yii migrate 3

    你也可以指定一个特定的迁移,按照如下格式使用 migrate/to 命令来指定数据库应该提交哪一个迁移:

    yii migrate/to 150101_185401 # using timestamp to specify the migration 使用时间戳来指定迁移 yii migrate/to "2015-01-01 18:54:01" # using a string that can be parsed by strtotime() 使用一个可以被 strtotime() 解析的字符串 yii migrate/to m150101_185401_create_news_table # using full name 使用全名 yii migrate/to 1392853618 # using UNIX timestamp 使用 UNIX 时间戳

    如果在指定要提交的迁移前面还有未提交的迁移,那么在执行这个被指定的迁移之前,这些还未提交的迁移会先被提交。

    如果被指定提交的迁移在之前已经被提交过,那么在其之后的那些迁移将会被还原。

    还原迁移

    你可以使用如下命令来还原其中一个或多个意见被提交过的迁移:

    yii migrate/down # revert the most recently applied migration 还原最近一次提交的迁移 yii migrate/down 3 # revert the most 3 recently applied migrations 还原最近三次提交的迁移

    注意:并不是所有的迁移都能被还原。尝试还原这类迁移将可能导致报错甚至是终止所有的还原进程。

    重做迁移

    重做迁移的意思是先还原指定的迁移,然后再次提交。如下所示:

    yii migrate/redo # redo the last applied migration 重做最近一次提交的迁移 yii migrate/redo 3 # redo the last 3 applied migrations 重做最近三次提交的迁移

    注意:如果一个迁移是不能被还原的,那么你将无法对它进行重做。

    列出迁移

    你可以使用如下命令列出那些提交了的或者是还未提交的迁移:

    yii migrate/history # 显示最近10次提交的迁移 yii migrate/history 5 # 显示最近5次提交的迁移 yii migrate/history all # 显示所有已经提交过的迁移 yii migrate/new # 显示前10个还未提交的迁移 yii migrate/new 5 # 显示前5个还未提交的迁移 yii migrate/new all # 显示所有还未提交的迁移

    修改迁移历史

    有时候你也许需要简单的标记一下你的数据库已经升级到一个特定的迁移,而不是实际提交或者是还原迁移。这个经常会发生在你手动的改变数据库的一个特定状态,而又不想相应的迁移被重复提交。那么你可以使用如下命令来达到目的:

    yii migrate/mark 150101_185401 # 使用时间戳来指定迁移 yii migrate/mark "2015-01-01 18:54:01" # 使用一个可以被 strtotime() 解析的字符串 yii migrate/mark m150101_185401_create_news_table # 使用全名 yii migrate/mark 1392853618 # 使用 UNIX 时间戳

    该命令将会添加或者删除 migration 表当中的某几行数据来表明数据库已经提交到了指定的某个迁移上。

    执行这条命令期间不会有任何的迁移会被提交或还原。

    全局配置命令

    在运行迁移命令的时候每次都要重复的输入一些同样的参数会很烦人,这时候,你可以选择在应用程序配置当中进行全局配置,一劳永逸:

    return [    'controllerMap' => [        'migrate' => [            'class' => 'yii\console\controllers\MigrateController',            'migrationTable' => 'backend_migration',        ],    ],];

    如上所示配置,在每次运行迁移命令的时候,backend_migration 表将会被用来记录迁移历史。你再也不需要通过migrationTable 命令行参数来指定这张历史纪录表了。

    迁移多个数据库

    默认情况下,迁移将会提交到由 db application component 所定义的同一个数据库当中。如果你需要提交到不同的数据库,你可以像下面那样指定 db 命令行选项,

    yii migrate --db=db2

    上面的命令将会把迁移提交到 db2 数据库当中。

    偶尔有限时候你需要提交 一些 迁移到一个数据库,而另外一些则提交到另一个数据库。为了达到这个目的,你应该在实现一个迁移类的时候指定需要用到的数据库组件的 ID , 如下所示:

    use yii\db\Schema;use yii\db\Migration;class m150101_185401_create_news_table extends Migration{    public function init()    {        $this->db = 'db2';        parent::init();    }}

    即使你使用 db 命令行选项指定了另外一个不同的数据库,上面的迁移还是会被提交到 db2 当中。需要注意的是这个时候迁移的历史信息依然会被记录到 db 命令行选项所指定的数据库当中。

    如果有多个迁移都使用到了同一个数据库,那么建议你创建一个迁移的基类,里面包含上述的 init() 代码。然后每个迁移类都继承这个基类就可以了。

    提示:除了在 yiidbMigration::db 参数当中进行设置以外,你还可以通过在迁移类中创建新的数据库连接来操作不同的数据库。然后通过这些连接再使用 DAO 方法 来操作不同的数据库。

    另外一个可以让你迁移多个数据库的策略是把迁移存放到不同的目录下,然后你可以通过如下命令分别对不同的数据库进行迁移:

    yii migrate --migrationPath=@app/migrations/db1 --db=db1yii migrate --migrationPath=@app/migrations/db2 --db=db2...

    第一条命令将会把 @app/migrations/db1 目录下的迁移提交到 db1 数据库当中,第二条命令则会把 @app/migrations/db2 下的迁移提交到 db2 数据库当中,以此类推。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。