ホームページ  >  記事  >  バックエンド開発  >  Yii Framework 公式ガイド シリーズ サプリメント 27 - データベースの操作: データベースの移行

Yii Framework 公式ガイド シリーズ サプリメント 27 - データベースの操作: データベースの移行

黄舟
黄舟オリジナル
2017-02-15 09:10:401121ブラウズ



注: Yii はバージョン 1.1.6 以降のデータベース移行機能のみをサポートします。

ソース コードと同様に、データベース駆動型アプリケーションを開発および保守するにつれて、データベースの構造も成長し続けます。たとえば、開発中に新しいテーブルを追加したり、アプリケーションが運用開始された後に、追加したりする必要がある場合があります。ソース コードとデータベースが同期していない場合、データベース構造へのこれらの変更の追跡 (移行と呼ばれます) は、ソース コードの操作と同じくらい重要であることに注意してください。壊す。 Yii フレームワークがデータベース移行履歴を追跡したり、新しい移行を適用したり、古い移行を元に戻したりするためのデータベース移行ツールを提供しているのはこのためです。

以下の手順は、開発中にデータベース移行を使用する方法を示しています。
Tim は新しい移行を追加します。 (例: 新しいテーブルの作成)
Tim がバージョン管理ツール (SVN、GIT など) に新しい移行を送信
Doug が更新し、バージョン管理ツールから新しい移行を取得
Doug が新しい移行をローカル開発バージョンに適用データベース

Yii フレームワークは、yiic 移行コマンド ライン ツールを介したデータベース移行をサポートします。このツールは、新しい移行の作成、移行の適用/元に戻す/キャンセル、移行履歴と新しい移行の表示をサポートします。

次に、このツールの使い方を説明します。

注: コマンドライン移行ツールを使用して移行する場合は、システム ディレクトリではなくアプリケーション ディレクトリ (例: cd path/to/protected) で yiic を使用するのが最善です。protectedmigrations フォルダーがあり、それが書き込み可能であることを確認してください。また、データベース接続が protected/config/console.php で設定されているかどうかを確認します。

1. 移行を作成します

新しい移行を作成する場合 (たとえば、ニュース テーブルを作成する)、次のコマンドを実行できます:

yiic migrate create <name>

パラメーター名は必須であり、移行に関する非常に簡単な説明を指定します。以下に示すように、name パラメータは PHP クラス名の一部です。また、文字、数字、アンダースコアのみを含めることができます。

yiic migrate create create_news_table

上記のコマンドは、パス protected/migrations の下に m101129_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(){}
    */
}

クラス名はファイル名と同じで、どちらも m モード。 は移行が作成されたときの UTC タイムスタンプ (yymmdd_hhmmss の形式) を表し、 はコマンドの名前付きパラメータから取得されます。

up() メソッドにはデータベース移行を実装するコードが含まれている必要があり、down() メソッドには up() メソッドの操作を復元するコードが含まれている必要があります。

場合によっては、down() での操作を実装できないことがあります。たとえば、up() メソッドでテーブルの行を削除した場合、down メソッドで復元することはできません。 この場合、移行は不可逆的と呼ばれます。これは、データベースを以前の状態にロールバックできないことを意味します。 上記で生成されたコードでは、down() メソッドは false を返し、移行が元に戻せないことを示します

情報: バージョン 1.1.7 以降、up() または down() メソッドが 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');
    }
}</p>
<p>基本クラス CDbMigration は、データとデータベースを操作するための一連のメソッドを提供します。たとえば、CDbMigration::createTable はデータベース テーブル CDbMigration を作成します。 :insert データ行が挿入されます。これらのメソッドはすべて、CDbMigration::getDbConnection() によって返されるデータベース接続を使用します。デフォルトは Yii::app()->db です。 </p>
<p>情報: CDbMigration によって提供されるデータベース メソッドは、CDbCommand のメソッドと非常によく似ていることに気づくかもしれません。実際、これらは基本的に同じですが、CDbMigration メソッドが実行にかかる時間を計算し、メソッド パラメーターに関する情報を出力する点が異なります。 </p>
<p>次のようにデータベースの操作方法を拡張することもできます: </p>
<pre class="brush:php;toolbar:false">public function up()
{
    $sql = "CREATE TABLE IF NOT EXISTS user(
        id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
        username VARCHAR(32) NOT NULL,
        password VARCHAR(32) NOT NULL,
        email VARCHAR(32) NOT NULL
    ) ENGINE=MyISAM";
    $this->createTableBySql('user',$sql);
}
public function createTableBySql($table,$sql){
    echo " > create table $table ...";
    $time=microtime(true);
    $this->getDbConnection()->createCommand($sql)->execute();
    echo " done (time: ".sprintf('%.3f', microtime(true)-$time)."s)\n";
}

2. トランザクション移行

情報: トランザクション移行の機能はバージョン 1.1.7 からサポートされています。

複雑なデータベース移行では、データベースの一貫性と整合性を維持するために、すべての移行が成功したか失敗したかを確認したいと考えています。 この目標を達成するには、データベース トランザクションを活用します。

データベース トランザクションを明示的に有効にして、他のデータベース関連のトランザクションを含むコードをアタッチできます。たとえば、

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() を実装することです。例:

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() が呼び出されます。

注: すべての DBMS がトランザクションをサポートしているわけではありません。また、この場合、トランザクションに配置することはできません。 MySQL の場合、一部の SQL ステートメントで競合が発生します。

3. 有効な新しい移行をすべて使用する (つまり、ローカル データベースを最新の状態にする) 場合は、次のコマンドを実行します:

yiic migrate

这个命令会显示所有新迁移的列表. 如果你确定使用迁移, 它将会在每一个新的迁移类中运行up()方法, 一个接着一个, 按照类名中的时间戳的顺序.

在使用迁移之后, 迁移工具会在一个数据表tbl_migration中写一条记录——允许工具识别应用了哪一个迁移. 如果tbl_migration表不存在 ,工具会在配置文件中db指定的数据库中自动创建。

有时候, 我们可能指向应用一条或者几条迁移. 那么可以运行如下命令:

yiic migrate up 3

这个命令会运行3个新的迁移. 该表value的值3将允许我们改变将要被应用的迁移的数目。

我们还可以通过如下命令迁移数据库到一个指定的版本:

yiic migrate to 101129_185401

也就是我们使用数据库迁移名中的时间戳部分来指定我们想要迁移到的数据库的版本。如果在最后应用的数据库迁移和指定的迁移之间有多个迁移, 所有这些迁移都会被应用. 如果指定迁移已经使用过了, 所有之后应用的迁移都会恢复。

4. 恢复迁移

想要恢复最后一个或几个已应用的迁移,我们可以运行如下命令:

yiic migrate down [step]

其中选项 step 参数指定了要恢复的迁移的数目. 默认是1, 意味着恢复最后一个应用的迁移.

正如我们之前所描述的, 不是所有的迁移都能恢复. 尝试恢复这种迁移会抛出异常并停止整个恢复进程。

5. 重做迁移

重做迁移意味着第一次恢复并且之后应用指定的迁移. 这个可以通过如下命令来实现:

yiic migrate redo [step]

其中可选的step参数指定了重做多少个迁移 . 默认是1, 意味着重做最后一个迁移.

6. 显示迁移信息

除了应用和恢复迁移之外, 迁移工具还可以显示迁移历史和被应用的新迁移。

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

其中可选的参数 limit 指定克显示的迁移的数目。如果limit没有被指定,所有的有效迁移都会被显示。

第一个命令显示已经被应用的迁移, 而第二个命令显示还没被应用的迁移。

7. 编辑迁移历史

有时候, 我们可能想要在没有应用和恢复相应迁移的时候编辑迁移历史来指定迁移版本. 这通常发生在开发一个新的迁移的时候. 我们使用下面的命令来实现这一目标.

yiic migrate mark 101129_185401

这个命令和yiic migrate to命令非常类似, 但它仅仅只是编辑迁移历史表到指定版本而没有应用或者恢复迁移。

8. 自定义迁移命令

有多种方式来自定义迁移命令。

使用命令行选项

迁移命令需要在命令行中指定四个选项:

interactive: boolean, specifies whether to perform migrations in an interactive mode. Defaults to true, meaning the user will be prompted when performing a 
specific migration. You may set this to false should the migrations be done in a background process.

migrationPath: string, specifies the directory storing all migration class files. This must be specified in terms of a path alias, and the corresponding 
directory must exist. If not specified, it will use the migrations sub-directory under the application base path.

migrationTable: string, specifies the name of the database table for storing migration history information. It defaults to tbl_migration. The table 
structure is version varchar(255) primary key, apply_time integer.

connectionID: string, specifies the ID of the database application component. Defaults to 'db'.

templateFile: string, specifies the path of the file to be served as the code template for generating the migration classes. This must be specified in terms of a 
path alias (e.g. application.migrations.template). If not set, an internal template will be used. Inside the template, the token {ClassName} will be replaced 
with the actual migration class name.

想要指定这些选项, 使用如下格式的迁移命令执行即可:

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

例如, 如果我们想要迁移一个论坛模块,它的迁移文件都放在模块的迁移文件夹中,可以使用如下命令:

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

注意在你设置布尔选项如interactive的时候,使用如下方式传入1或者0到命令行:

yiic migrate --interactive=0

配置全局命令

命令行选项允许我们快速配置迁移命令, 但有时候我们可能想要只配置一次命令. 例如, 我们可能想要使用不同的表来保存迁移历史, 或者我们想要使用自定义的迁移模板。我们可以通过编辑控制台应用的配置文件来实现,如下所示:

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

现在如果我们运行迁移命令,上述配置将会生效,而不需要我们每一次在命令行中都输入那么多选项信息。

以上就是Yii框架官方指南系列增补版27——使用数据库:数据库迁移的内容,更多相关内容请关注PHP中文网(www.php.cn)!


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