49 KiB
データベースマイグレーション
<<<<<<< HEAD
Note|注意: この節はまだ執筆中です。
ソースコードと同じように、データベースの構造も、データベース駆動型のアプリケーションが開発され保守されるにともなって徐々に発展していきます。 例えば、開発中に新しいテーブルが追加されることもあるでしょうし、アプリケーションが実運用に移行した後になって追加のインデックスが必要であることが発見されることもあるでしょう。 このようなデータベースの構造的な変更 (マイグレーション と呼ばれます) を追跡記録することが重要であるのは、ソースコードに対する変更がバージョン管理を使って追跡記録されるのと全く同じことです。 ソースコードとデータベースの同期が失われると、バグが発生するか、アプリケーション全体が動かなくなるかします。 こうした理由によって、Yii はデータベースマイグレーションツールを提供して、データベースマイグレーションの履歴の追跡管理、新しいマイグレーションの適用、また、既存のマイグレーションの取消が出来るようにしています。
下記のステップは、開発中にチームによってデータベースマイグレーションが使用される例を示すものです。
データベース駆動型のアプリケーションを開発し保守する途上で、ソースコードが進化するのと同じように、使用されるデータベースの構造も進化していきます。 例えば、アプリケーションの開発中に、新しいテーブルが必要であることが分ったり、アプリケーションを配備した後に、クエリのパフォーマンスを向上させるためにインデックスを作成すべきことが発見されたりします。 データベースの構造の変更が何らかのソースコードの変更を要求する場合はよくありますから、Yii はいわゆる データベースマイグレーション 機能を提供して、ソースコードとともにバージョン管理される データベースマイグレーション の形式でデータベースの変更を追跡できるようにしています。
下記の一連のステップは、開発中にチームによってデータベースマイグレーションがどのように使用されるかを示す例です。
yiichina/master
- Tim が新しいマイグレーション (例えば、新しいテーブルを作成したり、カラムの定義を変更したりなど) を作る。
- Tim が新しいマイグレーションをソースコントロールシステム (例えば Git や Mercurial) にコミットする。
- Doug がソースコントロールシステムから自分のレポジトリを更新して新しいマイグレーションを受け取る。 <<<<<<< HEAD
- Doug がマイグレーションを彼のローカルの開発用データベースに適用し、Tim が行った変更を反映して、自分のデータベースを同期する。
Yii はデータベースマイグレーションを yii migrate
コマンドラインツールによってサポートします。
このツールは、以下の機能をサポートしています。
- 新しいマイグレーションの作成
- マイグレーションの適用、取消、再適用
- マイグレーションの履歴と新規マイグレーションの閲覧
マイグレーションを作成する
======= 4. Doug がマイグレーションを彼のローカルの開発用データベースに適用して、Tim が行った変更を反映するように自分のデータベースの同期を取る。
そして、次の一連のステップは、本番環境でデータベースマイグレーションとともに新しいリリースを配備する方法を示すものです。
- Scott は新しいデータベースマイグレーションをいくつか含むプロジェクトのレポジトリにリリースタグを作成する。
- Scott は本番サーバでソースコードをリリースタグまで更新する。
- Scott は本番のデータベースに対して累積したデータベースマイグレーションを全て適用する。
Yii は一連のマイグレーションコマンドラインツールを提供しており、以下の機能をサポートしています。
- 新しいマイグレーションの作成
- マイグレーションの適用
- マイグレーションの取消
- マイグレーションの再適用
- マイグレーションの履歴と状態の閲覧
これらのツールは、全て、yii migrate
コマンドからアクセスすることが出来ます。
この節では、これらのツールを使用して、さまざまなタスクをどうやって達成するかを詳細に説明します。
各ツールの使用方法は、ヘルプコマンド yii help migrate
によっても知ることが出来ます。
Note|注意: マイグレーションはデータベーススキーマに影響を及ぼすだけでなく、既存のデータを新しいスキーマに合うように修正したり、RBAC 階層を作成したり、キャッシュをクリーンアップしたりすることも出来ます。
マイグレーションを作成する
yiichina/master
新しいマイグレーションを作成するためには、次のコマンドを実行します。
yii migrate/create <name>
要求される name
パラメータには、マイグレーションの非常に短い説明を指定します。
<<<<<<< HEAD
例えば、マイグレーションが news という名前のテーブルを作成するものである場合は、コマンドを次のようにして使います。
例えば、マイグレーションが news という名前のテーブルを作成するものである場合は、create_news_table
という名前を使って、次のようにコマンドを実行すれば良いでしょう。
yiichina/master
yii migrate/create create_news_table
<<<<<<< HEAD
すぐ後で説明するように、マイグレーションでは、この name
パラメータは PHP のクラス名の一部として使用されます。
したがって、アルファベット、数字、および/または、アンダースコアだけを含まなければなりません。
上記のコマンドは、m101129_185401_create_news_table.php
という名前の新しいファイルを作成します。
このファイルは @app/migrations
ディレクトリに作成されます。
初期状態では、このマイグレーションファイルは以下のコードを含んでいます。
class m101129_185401_create_news_table extends \yii\db\Migration
=======
> Note|注意: この `name` 引数は、生成されるマイグレーションクラス名の一部として使用されますので、アルファベット、数字、および/または、アンダースコアだけを含むものでなければなりません。
上記のコマンドは、`m150101_185401_create_news_table.php` という名前の新しい PHP クラスファイルを `@app/migrations` ディレクトリに作成します。
このファイルは、主として、`m150101_185401_create_news_table` というマイグレーションクラスを宣言するためのもので、次のようなスケルトンコードを含んでいます。
```php
<?php
use yii\db\Schema;
use yii\db\Migration;
class m150101_185401_create_news_table extends Migration
>>>>>>> yiichina/master
{
public function up()
{
}
public function down()
{
echo "m101129_185401_create_news_table cannot be reverted.\n";
return false;
}
}
<<<<<<< HEAD
クラス名はファイル名と同じであり、m<timestamp>_<name>
というパターンに従います。ここで、
<timestamp>
は、マイグレーションが作成された (yymmdd_hhmmss
という書式の) UTC タイムスタンプであり、<name>
は、コマンドのname
パラメータから取られた文字列です。
クラスの中では、up()
メソッドが、実際のデータベースマイグレーションを実装するコードを含むべきメソッドです。
言い換えると、up()
メソッドが実際にデータベースを変更するコードを実行します。
down()
メソッドは、up()
によって加えられた変更を取り消すコードを含むことが出来ます。
場合によっては、down()
がデータベースマイグレーションを取り消すことが出来ないことがあります。
例えば、マイグレーションがテーブルの行やテーブル全体を削除した場合は、そのデータを down()
メソッドで復旧することは出来ません。
そのような場合には、マイグレーションは不可逆であると呼ばれ、データベースを以前の状態にロールバックすることは出来ません。
マイグレーションが不可逆である場合は、生成された上記のコードのように、down()
メソッドは false
を返して、マイグレーションが取り消せないものであることを示します。
例として、新しいテーブルを作成するマイグレーションを示しましょう。
各データベースマイグレーションは yii\db\Migration から拡張した PHP クラスとして定義されます。
マイグレーションクラスの名前は、m<YYMMDD_HHMMSS>_<Name>
という形式で自動的に生成されます。
ここで、
<YYMMDD_HHMMSS>
は、マイグレーション作成コマンドが実行された UTC 日時を表し、<Name>
は、あなたがコマンドに与えたname
引数と同じ値になります。
マイグレーションクラスにおいて、あなたがなすべき事は、データベースの構造に変更を加える up()
メソッドにコードを書くことです。
また、up()
によって加えられた変更を取り消すための down()
メソッドにも、コードを書きたいと思うかもしれません。
up()
メソッドは、このマイグレーションによってデータベースをアップグレードする際に呼び出され、down()
メソッドはデータベースをダウングレードする際に呼び出されます。
下記のコードは、新しい news
テーブルを作成するマイグレーションクラスをどのようにして実装するかを示すものです。
yiichina/master
use yii\db\Schema;
<<<<<<< HEAD
class m101129_185401_create_news_table extends \yii\db\Migration
=======
use yii\db\Migration;
class m150101_185401_create_news_table extends \yii\db\Migration
>>>>>>> yiichina/master
{
public function up()
{
$this->createTable('news', [
<<<<<<< HEAD
'id' => 'pk',
=======
'id' => Schema::TYPE_PK,
>>>>>>> yiichina/master
'title' => Schema::TYPE_STRING . ' NOT NULL',
'content' => Schema::TYPE_TEXT,
]);
}
public function down()
{
$this->dropTable('news');
}
}
<<<<<<< HEAD
基底クラスである \yii\db\Migration が、データベース接続を db
プロパティによって提供しています。
これを使って、データベースのデータとスキーマを操作することが出来ます。
この例で使われているカラムのタイプは抽象的なタイプであり、Yii によって、あなたが使用するデータベース管理システムに応じて、対応するタイプに置き換えられます。
抽象的なタイプを使うと、データベースに依存しないマイグレーションを書くことが出来ます。
例えば、pk
は、MySQL では int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY
に置き換えられ、sqlite では integer PRIMARY KEY AUTOINCREMENT NOT NULL
に置き換えられます。
さらに詳細な説明と、利用可能なタイプについては、yii\db\QueryBuilder::getColumnType() のドキュメントを参照してください。
また、カラムのタイプを定義するのに、yii\db\Schema で定義されている定数を使うことも出来ます。
Note|注意: テーブル定義の最後に、単純な文字列として指定された、制約やその他の特別なテーブルオプションを追加することが出来ます。 例えば、上記のマイグレーションでは、
content
属性の定義の後に、'CONSTRAINT ...'
やその他の特別なオプションを書くことが出来ます。
トランザクションを使うマイグレーション
複雑な DB マイグレーションを実行するときは、通常、データベースの一貫性と整合性を保つために、個々のマイグレーションが全体として成功または失敗することを保証する必要があります。
この目的を達成するために、DB トランザクションを利用することが出来ます。
この目的のためには、safeUp
と safeDown
という特別なメソッドを使います。
Info|情報: 全てのマイグレーションが取り消し可能な訳ではありません。 例えば、
up()
メソッドがテーブルからある行を削除するものである場合、down()
メソッドでその行を回復することは出来ません。 また、データベースマイグレーションを取り消すことはあまり一般的ではありませんので、場合によっては、面倒くさいというだけの理由でdown()
を実装しないこともあるでしょう。 そういう場合は、マイグレーションが取り消し不可能であることを示すために、down()
メソッドで false を返さなければなりません。
基底のマイグレーションクラス yii\db\Migration は、yii\db\Migration::db プロパティによって、データベース接続にアクセスすることを可能にしています。 このデータベース接続によって、データベーススキーマを扱う で説明されているメソッドを使い、データベーススキーマを操作することが出来ます。
テーブルやカラムを作成するときは、物理的な型を使うのでなく、抽象型 を使って、あなたのマイグレーションが特定の DBMS に依存しないようにします。
yii\db\Schema クラスが、サポートされている抽象型を表す一連の定数を定義しています。
これらの定数は TYPE_<Name>
という形式の名前を持っています。
例えば、TYPE_PK
は、オートインクリメントのプライマリキー型であり、TYPE_STRING
は文字列型です。
これらの抽象型は、マイグレーションが特定のデータベースに適用されるときに、対応する物理型に翻訳されます。
MySQL の場合は、TYPE_PK
は int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY
に変換され、TYPE_STRING
は varchar(255)
となります。
抽象型を使用するときに、付随的な制約を追加することが出来ます。
上記の例では、Schema::TYPE_STRING
に NOT NULL
を追加して、このカラムが null を許容しないことを指定しています。
Info|情報: 抽象型と物理型の対応関係は、それぞれの
QueryBuilder
の具象クラスの yii\db\QueryBuilder::$typeMap プロパティによって定義されています。
トランザクションを使うマイグレーション
複雑な一連の DB マイグレーションを実行するときは、通常、データベースの一貫性と整合性を保つために、各マイグレーションが全体として成功または失敗することを保証する必要があります。 この目的を達成するために、各マイグレーションの DB 操作を トランザクション で囲むことが推奨されます。
トランザクションを使うマイグレーションを実装するためのもっと簡単な方法は、マイグレーションのコードを safeUp()
と safeDown()
のメソッドに入れることです。
この二つのメソッドが up()
および down()
と違う点は、これらが暗黙のうちにトランザクションに囲まれていることです。
結果として、これらのメソッドの中で何か操作が失敗した場合は、先行する全ての操作が自動的にロールバックされます。
次の例では、news
テーブルを作成するだけでなく、このテーブルに初期値となる行を挿入しています。
yiichina/master
use yii\db\Schema;
<<<<<<< HEAD
class m101129_185401_create_news_table extends \yii\db\Migration
=======
use yii\db\Migration;
class m150101_185401_create_news_table extends Migration
>>>>>>> yiichina/master
{
public function safeUp()
{
$this->createTable('news', [
'id' => 'pk',
'title' => Schema::TYPE_STRING . ' NOT NULL',
'content' => Schema::TYPE_TEXT,
]);
<<<<<<< HEAD
$this->createTable('user', [
'id' => 'pk',
'login' => Schema::TYPE_STRING . ' NOT NULL',
'password' => Schema::TYPE_STRING . ' NOT NULL',
=======
$this->insert('news', [
'title' => 'test 1',
'content' => 'content 1',
>>>>>>> yiichina/master
]);
}
public function safeDown()
{
<<<<<<< HEAD
$this->dropTable('news');
$this->dropTable('user');
}
}
使用するクエリが一つだけでない場合は、safeUp
と safeDown
を使うことを推奨します。
Note|注意: 全ての DBMS がトランザクションをサポートしている訳ではありません。 また、トランザクションに入れることが出来ない DB クエリもあります。 その場合には、代りに、
up()
とdown()
を実装しなければなりません。 また、MySQL の場合は、暗黙のコミット を引き起こす SQL 文があります。
マイグレーションを適用する
利用できる全ての新しいマイグレーションを適用する (すなわち、ローカルのデータベースを最新の状態にする) ためには、次のコマンドを実行します。
$this->delete('news', ['id' => 1]);
$this->dropTable('news');
}
}
通常、`safeUp()` で複数の DB 操作を実行する場合は、`safeDown()` では実行の順序を逆にしなければならないことに注意してください。
上記の例では、`safeUp()` では、最初にテーブルを作って、次に行を挿入し、`safeDown()` では、先に行を削除して、次にテーブルを削除しています。
> Note|注意: 全ての DBMS がトランザクションをサポートしている訳ではありません。
また、トランザクションに入れることが出来ない DB クエリもあります。
いくつかの例を [暗黙のコミット](http://dev.mysql.com/doc/refman/5.1/en/implicit-commit.html) で見ることが出来ます。
その場合には、代りに、`up()` と `down()` を実装しなければなりません。
### データベースアクセスメソッド <span id="db-accessing-methods"></span>
基底のマイグレーションクラス [[yii\db\Migration]] は、データベースにアクセスして操作するための一連のメソッドを提供しています。
あなたは、これらのメソッドが、[[yii\db\Command]] クラスによって提供される [DAO メソッド](db-dao.md) と同じような名前を付けられていることに気付くでしょう。
例えば、[[yii\db\Migration::createTable()]] メソッドは、[[yii\db\Command::createTable()]] と全く同じように、新しいテーブルを作成します。
[[yii\db\Migration]] によって提供されているメソッドを使うことの利点は、[[yii\db\Command]] インスタンスを明示的に作成する必要がないこと、そして、各メソッドを実行すると、どのようなデータベース操作がどれだけの時間をかけて実行されたかを教えてくれる有益なメッセージが自動的に表示されることです。
以下がそういうデータベースアクセスメソッドの一覧です。
* [[yii\db\Migration::execute()|execute()]]: SQL 文を実行
* [[yii\db\Migration::insert()|insert()]]: 一行を挿入
* [[yii\db\Migration::batchInsert()|batchInsert()]]: 複数行を挿入
* [[yii\db\Migration::update()|update()]]: 行を更新
* [[yii\db\Migration::delete()|delete()]]: 行を削除
* [[yii\db\Migration::createTable()|createTable()]]: テーブルを作成
* [[yii\db\Migration::renameTable()|renameTable()]]: テーブルの名前を変更
* [[yii\db\Migration::dropTable()|dropTable()]]: テーブルを削除
* [[yii\db\Migration::truncateTable()|truncateTable()]]: テーブル中の全ての行を削除
* [[yii\db\Migration::addColumn()|addColumn()]]: カラムを追加
* [[yii\db\Migration::renameColumn()|renameColumn()]]: カラムの名前を変更
* [[yii\db\Migration::dropColumn()|dropColumn()]]: カラムを削除
* [[yii\db\Migration::alterColumn()|alterColumn()]]: カラムの定義を変更
* [[yii\db\Migration::addPrimaryKey()|addPrimaryKey()]]: プライマリキーを追加
* [[yii\db\Migration::dropPrimaryKey()|dropPrimaryKey()]]: プライマリキーを削除
* [[yii\db\Migration::addForeignKey()|addForeignKey()]]: 外部キーを追加
* [[yii\db\Migration::dropForeignKey()|dropForeignKey()]]: 外部キーを削除
* [[yii\db\Migration::createIndex()|createIndex()]]: インデックスを作成
* [[yii\db\Migration::dropIndex()|dropIndex()]]: インデックスを削除
> Info|情報: [[yii\db\Migration]] は、データベースクエリメソッドを提供しません。
これは、データベースからデータを取得することについては、通常、追加のメッセージを表示する必要がないからです。
更にまた、複雑なクエリを構築して実行するためには、強力な [クエリビルダ](db-query-builder.md) を使うことが出来るからです。
## マイグレーションを適用する <span id="applying-migrations"></span>
データベースを最新の構造にアップグレードするためには、利用できる全ての新しいマイグレーションを適用するために、次のコマンドを使わなければなりません。
>>>>>>> yiichina/master
yii migrate
<<<<<<< HEAD
コマンドを実行すると、すべての新しいマイグレーションが一覧表示されます。
マイグレーションを適用することを確認すると、クラス名のタイムスタンプの値の順に、一つずつ、すべての新しいマイグレーションクラスの `up()` メソッドが実行されます。
マイグレーションを適用した後に、マイグレーションツールは `migration` という名前のデータベーステーブルに記録を残します。
これによって、ツールは、どのマイグレーションが適用済みで、どのマイグレーションが適用されていないかを特定することが出来ます。
`migration` テーブルが存在しない場合は、ツールは `db` [アプリケーションコンポーネント](structure-application-components.md)によって指定されたデータベースの中にテーブルを自動的に作成します。
時として、新しいマイグレーションを一個また数個だけ適用したい場合があります。その場合は、次のコマンドを使うことが出来ます。
yii migrate/up 3
このコマンドは、次の新しいマイグレーションを 3 個適用します。3 という値を変更して、適用されるマイグレーションの数を変更することが出来ます。
また、下記のコマンドを使って、特定のバージョンまでデータベースをマイグレートすることも可能です。
yii migrate/to 101129_185401
すなわち、マイグレーション名のタイムスタンプ部分を使って、データベースをマイグレートして到達したいバージョンを指定します。
最後に適用されたマイグレーションと指定されたマイグレーションの間に複数のマイグレーションがある場合は、それらのマイグレーションがすべて適用されます。
指定されたマイグレーションが適用済みである場合は、その後に適用されたすべてのマイグレーションが取り消されます (次の節で説明します)。
マイグレーションを取り消す
--------------------------
適用された最後のマイグレーション (一個または複数個) を取り消したい場合は、下記のコマンドを使うことが出来ます。
yii migrate/down [step]
ここで、オプションの `step` パラメータは何個のマイグレーションを取り消すかを指定するものです。
デフォルト値は 1 で、適用された最後のマイグレーションだけが取り消されることを意味します。
前に説明したように、全てのマイグレーションが取り消せるとは限りません。
取り消せないマイグレーションを取り消そうとすると例外が投げられて、取り消しのプロセス全体が終了させられます。
マイグレーションを再適用する
----------------------------
=======
コマンドを実行すると、まだ適用されていない全てのマイグレーションが一覧表示されます。
リストされたマイグレーションを適用することをあなたが確認すると、タイムスタンプの値の順に、一つずつ、すべての新しいマイグレーションクラスの `up()` または `safeUp()` メソッドが実行されます。
マイグレーションのどれかが失敗した場合は、コマンドは残りのマイグレーションを適用せずに終了します。
適用が成功したマイグレーションの一つ一つについて、`migration` という名前のデータベーステーブルに行が挿入されて、マイグレーションの成功が記録されます。
この記録によって、マイグレーションツールは、どのマイグレーションが適用され、どのマイグレーションが適用されていないかを特定することが出来ます。
> Info|情報: マイグレーションツールは、コマンドの [[yii\console\controllers\MigrateController::db|db]] オプションで指定されたデータベースに `migration` テーブルを自動的に作成します。
デフォルトでは、このデータベースは `db` [アプリケーションコンポーネント](structure-application-components.md) によって指定されます。
時として、利用できる全てのマイグレーションではなく、一つまたは数個の新しいマイグレーションだけを適用したい場合があります。
コマンドを実行するときに、適用したいマイグレーションの数を指定することによって、そうすることが出来ます。
例えば、次のコマンドは、利用できるマイグレーションのうち、次の三個を適用しようとするものです。
yii migrate 3
また、このマイグレーションまでデータベースに適用したいという特定のマイグレーションを明示的に指定することも出来ます。
そのためには、`migrate/to` コマンドを、次のどれかの形式で使います。
yii migrate/to 150101_185401 # タイムスタンプを使ってマイグレーションを指定 yii migrate/to "2015-01-01 18:54:01" # strtotime() によって解釈できる文字列を使用 yii migrate/to m150101_185401_create_news_table # フルネームを使用 yii migrate/to 1392853618 # UNIX タイムスタンプを使用
指定されたマイグレーションよりも古いものが適用されずに残っている場合は、指定されたものが適用される前に、すべて適用されます。
指定されたマイグレーションが既に適用済みである場合、それより新しいものが適用されていれば、すべて取り消されます。
## マイグレーションを取り消す <span id="reverting-migrations"></span>
適用済みのマイグレーションを一個または複数個取り消したい場合は、下記のコマンドを使うことが出来ます。
yii migrate/down # 最近に適用されたマイグレーションを取り消す yii migrate/down 3 # 最近に適用された三個のマイグレーションを取り消す
> Note|注意: 全てのマイグレーションが取り消せるとは限りません。
そのようなマイグレーションを取り消そうとするとエラーとなり、取り消しのプロセス全体が終了させられます。
## マイグレーションを再適用する <span id="redoing-migrations"></span>
>>>>>>> yiichina/master
マイグレーションの再適用とは、指定されたマイグレーションを最初に取り消してから、再度適用することを意味します。
これは次のコマンドによって実行することが出来ます。
<<<<<<< HEAD yii migrate/redo [step]
ここで、オプションの `step` パラメータは何個のマイグレーションを再適用するかを指定するものです。
デフォルト値は 1 で、最後のマイグレーションだけが再適用されることを意味します。
マイグレーション情報を表示する
------------------------------
マイグレーションを適用したり取り消したりする他に、マイグレーションツールはマイグレーションの履歴、および、まだ適用されていない新しいマイグレーションを表示することも出来ます。
yii migrate/history [limit] yii migrate/new [limit]
ここで、オプションの `limit` パラメータは、何個のマイグレーションを表示するかを指定するものです。
`limit` が指定されない場合は、利用可能な全てのマイグレーションが表示されます。
最初のコマンドは適用済みのマイグレーションを表示し、第二のコマンドはまだ適用されていないマイグレーションを表示します。
マイグレーション履歴を修正する
------------------------------
時として、実際には関係のあるマイグレーションを適用または取り消すことなく、マイグレーション履歴を特定のマイグレーションバージョンに修正したい場合があります。
このことは新しいマイグレーションを開発するときにしばしば起ります。
次のコマンドを使ってこの目的を達することが出来ます。
yii migrate/mark 101129_185401
このコマンドは `yii migrate/to` コマンドと非常によく似ていますが、マイグレーションを適用または取り消すことなく、マイグレーション履歴テーブルを指定されたバージョンに修正することだけを行うという点で違っています。
マイグレーションコマンドをカスタマイズする
------------------------------------------
マイグレーションコマンドをカスタマイズする方法がいくつかあります。
### コマンドラインオプションを使う
マイグレーションコマンドには、コマンドラインで指定できるいくつかのオプションがあります。
* `interactive`: 真偽値。マイグレーションを対話モードで実行するかどうかを指定します。
デフォルト値は true で、指定されたマイグレーションを実行するときに、ユーザは何らかの入力を促されます。
このオプションを false にセットして、マイグレーションがバックグラウンドプロセスとして実行されるようにすることが出来ます。
* `migrationPath`: 文字列。全てのマイグレーションクラスファイルを保存しているディレクトリを指定します。
このパスは、パスエイリアスの形式で指定されなければならず、また、対応するディレクトリが存在する必要があります。
このオプションが指定されない場合は、アプリケーションのベースパスの下の `migrations` サブディレクトリが使われます。
* `migrationTable`: 文字列。マイグレーション履歴の情報を保存するためのデータベーステーブル名を指定します。
デフォルト値は `migration` です。このテーブルは、`version varchar(255) primary key, apply_time integer` という構造を持ちます。
* `db`: 文字列。データベース [アプリケーションコンポーネント](structure-application-components.md) の ID を指定します。
デフォルト値は 'db' です。
* `templateFile`: 文字列。マイグレーションクラスを生成するためのコードテンプレートとして使われるファイルのパスを指定します。
このパスは、パスエイリアスの形式で指定しなければなりません (例えば、`application.migrations.template`)。
指定されない場合は、内部テンプレートが使用されます。
テンプレートの中の `{ClassName}` というトークンが実際のマイグレーションクラス名によって置き換えられます。
これらのオプションを指定するためには、下記の書式を使って migrate コマンドを実行します。
yii migrate/up --option1=value1 --option2=value2 ...
例えば、`forum` モジュールのためのマイグレーションを実行するときに、マイグレーションファイルがモジュールの `migrations` ディレクトリに置かれている場合には、下記のコマンドを使うことが出来ます。
yii migrate/up --migrationPath=@app/modules/forum/migrations
### コマンドをグローバルに構成する
コマンドラインオプションを使ってマイグレーションコマンドをその場その場で構成することも出来ますが、場合によっては、一度にまとめてコマンドを構成しておきたいこともあります。
例えば、マイグレーションの履歴を保存するのに別のテーブルを使用したいとか、カスタマイズしたマイグレーションテンプレートを使用したいとかです。
そうするためには、コンソールアプリケーションの構成情報ファイルを以下のように修正します。
```php
'controllerMap' => [
'migrate' => [
'class' => 'yii\console\controllers\MigrateController',
'migrationTable' => 'my_custom_migrate_table',
],
]
これで、migrate
コマンドを実行すると、上記の構成情報が効果を発揮して、毎回コマンドラインオプションを入力する必要がなくなります。
その他のコマンドラインオプションも、このようにして構成することが出来ます。
複数のデータベースのマイグレーション
デフォルトでは、マイグレーションは db
アプリケーションコンポーネント によって指定されるデータベースに対して適用されます。
これは、--db
オプションを指定することによって変更することが出来ます。例えば、
yii migrate/redo # 最後に適用されたマイグレーションを再適用する yii migrate/redo 3 # 最後に適用された三個のマイグレーションを再適用する
> Note|注意: マイグレーションが取り消し不可能な場合は、それを再適用することは出来ません。
[kihara]
## マイグレーションをリスト表示する <span id="listing-migrations"></span>
どのマイグレーションが適用済みであり、どのマイグレーションが未適用であるかをリスト表示するために、次のコマンドを使うことが出来ます。
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 # 適用可能な全てのマイグレーションを表示
## マイグレーション履歴を修正する <span id="modifying-migration-history"></span>
時として、実際にマイグレーションを適用したり取り消したりするのではなく、データベースが特定のマイグレーションまでアップグレードされたとマークしたいだけ、という場合があります。
このようなことがよく起るのは、データベースを手作業で特定の状態に変更した後に、その変更のための一つまたは複数のマイグレーションを記録はするが適用はしたくない、という場合です。
次のコマンドでこの目的を達することが出来ます。
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` テーブルを修正し、データベースが指定されたものまでマイグレーションが適用済みであることを示します。
このコマンドによってマイグレーションが適用されたり取り消されたりはしません。
## マイグレーションをカスタマイズする <span id="customizing-migrations"></span>
マイグレーションコマンドをカスタマイズする方法がいくつかあります。
### コマンドラインオプションを使う <span id="using-command-line-options"></span>
マイグレーションコマンドには、その動作をカスタマイズするために使うことが出来るコマンドラインオプションがいくつかあります。
* `interactive`: 真偽値 (デフォルト値は true)。
マイグレーションを対話モードで実行するかどうかを指定します。
true である場合は、コマンドが何らかの操作を実行する前に、ユーザは確認を求められます。
コマンドがバックグラウンドのプロセスで使用される場合は、このオプションを false にセットします。
* `migrationPath`: 文字列 (デフォルト値は `@app/migrations`)。
全てのマイグレーションクラスファイルを保存しているディレクトリを指定します。
この値は、ディレクトリパスか、パス [エイリアス](concept-aliases.md) として指定することが出来ます。
ディレクトリが存在する必要があり、そうでなければコマンドがエラーを発生させることに注意してください。
* `migrationTable`: 文字列 (デフォルト値は `migration`)。
マイグレーション履歴の情報を保存するためのデータベーステーブル名を指定します。
テーブルが存在しない場合は、コマンドによって自動的に作成されます。
`version varchar(255) primary key, apply_time integer` という構造のテーブルを手作業で作成しても構いません。
* `db`: 文字列 (デフォルト値は `db`)。
データベース [アプリケーションコンポーネント](structure-application-components.md) の ID を指定します。
このコマンドによってマイグレーションを適用されるデータベースを表します。
* `templateFile`: 文字列 (デフォルト値は `@yii/views/migration.php`)。
スケルトンのマイグレーションクラスファイルを生成するために使用されるテンプレートファイルのパスを指定します。
この値は、ファイルパスか、パス [エイリアス](concept-aliases.md) として指定することが出来ます。
テンプレートファイルは PHP スクリプトであり、その中で、マイグレーションクラスの名前を取得するための `$className` という事前定義された変数を使うことが出来ます。
次の例は、これらのオプションの使い方を示すものです。
例えば、`forum` モジュールにマイグレーションを適用しようとしており、そのマイグレーションファイルがモジュールの `migrations` ディレクトリに配置されている場合、次のコマンドを使うことが出来ます。
forum モジュールのマイグレーションを非対話的に適用する
yii migrate --migrationPath=@app/modules/forum/migrations --interactive=0
### コマンドをグローバルに構成する <span id="configuring-command-globally"></span>
マイグレーションコマンドを実行するたびに同じオプションの値を入力する代りに、次のように、アプリケーションの構成情報でコマンドを一度だけ構成して済ませることが出来ます。
```php
return [
'controllerMap' => [
'migrate' => [
'class' => 'yii\console\controllers\MigrateController',
'migrationTable' => 'backend_migration',
],
],
];
上記のように構成しておくと、migrate
コマンドを実行するたびに、backend_migration
テーブルがマイグレーション履歴を記録するために使われるようになります。
もう、migrationTable
のコマンドラインオプションを使ってテーブルを指定する必要はなくなります。
複数のデータベースにマイグレーションを適用する
デフォルトでは、マイグレーションは db
アプリケーションコンポーネント によって指定された同じデータベースに対して適用されます。
マイグレーションを別のデータベースに適用したい場合は、次のように、db
コマンドラインオプションを指定することが出来ます。
yiichina/master
yii migrate --db=db2
<<<<<<< HEAD
上記のコマンドは、デフォルトのマイグレーションパスに置かれている 全ての マイグレーションを db2
データベースに適用するものです。
アプリケーションが複数のデータベースを扱っている場合は、いくつかのマイグレーションはあるデータベースに適用されなければならず、他のマイグレーションは別のデータベースに適用されなければならない、ということがあり得ます。 そのような場合には、異なるデータベースごとに基底マイグレーションクラスを作成して、下記のように yii\db\Migration::init() メソッドをオーバーライドすることを推奨します。
public function init()
{
$this->db = 'db2';
parent::init();
}
こうすると、特定のデータベースに適用されるべきマイグレーションを作成するためには、対応する基底マイグレーションクラスから拡張するだけで済みます。
これで、yii migrate
コマンドを実行すると、全てのマイグレーションはそれぞれ対応するデータベースに対して適用されるようになります。
Info|情報: それぞれのマイグレーションはハードコードされた DB 接続を使用しますので、
migrate
コマンドの--db
オプションは効果を持ちません。 また、マイグレーション履歴はデフォルトのdb
データベースに保存されることに注意してください。
--db
オプションによる DB 接続の変更をサポートしたい場合は、次のような別の方法で複数のデータベースを扱うことが出来ます。
それぞれのデータベースについて、マイグレーションパスを作成し、対応する全てのマイグレーションクラスをそこに保存します。 マイグレーションを適用するためには、次のようなコマンドを実行します。
上記のコマンドはマイグレーションを db2
データベースに適用します。
場合によっては、いくつかの マイグレーションはあるデータベースに適用し、別のいくつかの マイグレーションはもう一つのデータベースに適用したい、ということがあります。 この目的を達するためには、マイグレーションクラスを実装する時に、そのマイグレーションが使用する DB コンポーネントの 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()
コードを持つ基底のマイグレーションクラスを作成することを推奨します。
そうすれば、個々のマイグレーションクラスは、その基底クラスから拡張することが出来ます。
こうすると、特定のデータベースに適用されるべきマイグレーションを作成するためには、対応する基底マイグレーションクラスから拡張するだけで済みます。
これで、yii migrate
コマンドを実行すると、全てのマイグレーションはそれぞれ対応するデータベースに対して適用されるようになります。
Tip|ヒント: 異なるデータベースを操作するためには、yii\db\Migration::db プロパティを設定する以外にも、マイグレーションクラスの中で新しいデータベース接続を作成するという方法があります。 そうすれば、そのデータベース接続で DAO メソッド を使って、違うデータベースを操作することが出来ます。
複数のデータベースに対してマイグレーションを適用するために採用できるもう一つの戦略としては、異なるデータベースに対するマイグレーションは異なるマイグレーションパスに保持する、というものがあります。 そうすれば、次のように、異なるデータベースのマイグレーションを別々のコマンドで適用することが出来ます。
yiichina/master
yii migrate --migrationPath=@app/migrations/db1 --db=db1
yii migrate --migrationPath=@app/migrations/db2 --db=db2
...
<<<<<<< HEAD
Info|情報: 上記の方法では、マイグレーション履歴は
--db
オプションによって指定された別々のデータベースに保存されます。 ======= 最初のコマンドは@app/migrations/db1
にあるマイグレーションをdb1
データベースに適用し、第二のコマンドは@app/migrations/db2
にあるマイグレーションをdb2
データベースに適用する、という具合です。yiichina/master