Yii-database-migration
Yii-データベースの移行
データベース駆動型アプリケーションの開発中、データベース構造はソースコードとともに進化します。 Yiiは、データベースの変更を追跡できる database migration 機能を提供します。
Yiiは、次の移行コマンドラインツールを提供します-
- 新しい移行を作成する
- 移行を元に戻す
- 移行を適用する
- 移行を再適用する
- 移行ステータスと履歴を表示する
移行の作成
新しいデータベース移行を作成しましょう。
- ステップ1 *-基本的なアプリケーションテンプレートのプロジェクトルート内で、コンソールウィンドウを開いて実行します。
上記のコマンドは、 migrations フォルダーに新しい移行ファイル(この場合はm160113_102634_add_news_table.php)を作成します。
ファイルには次のコードが含まれています-
各DB移行は、 yii \ db \ Migration クラスを拡張するPHPクラスです。 クラス名は、次の形式で生成されます-
ここで、 <YYMMDD_HMMSS> は移行コマンドが実行されたUTC日時で、<Name>はコンソールコマンドで指定した引数です。
データベースをアップグレードするとup()メソッドが呼び出され、データベースをダウングレードするとdown()メソッドが呼び出されます。
- ステップ2 *-新しいテーブルをデータベースに追加するには、この方法で移行ファイルを変更します。
上記のコードでは、* up()メソッドでnewsという新しいテーブルを作成し、 down()*メソッドでこのテーブルを削除しました。
- ステップ3 *-データベースをアップグレードするには、このコマンドを実行します。
上記のコマンドは、まだ適用されていない利用可能なすべての移行を一覧表示します。 次に、移行の適用を確認すると、すべての新しい移行クラスでsafeUp()またはup()が実行されます。
- ステップ4 *-利用可能な移行を3つだけ適用するには、実行できます。
- ステップ5 *-データベースを移行する特定の移行を定義することもできます。
#タイムスタンプを使用して移行を指定する
#strtotime()で解析できる文字列を使用
#フルネームを使用
#UNIXタイムスタンプを使用
- ステップ6 *-移行を元に戻すには(down()またはsafeDown()メソッドを実行)、実行します。
- ステップ7 *-最も最近適用された5つの移行を元に戻すには、実行できます。
- ステップ8 *-移行をやり直す(元に戻してから再度適用する)には、実行します。
すでに適用された移行を一覧表示するには、これらのコマンドを使用します-
- yii migrate/new #最初の10個の新しい移行を表示
- yii migrate/new 3 #最初の3つの新しい移行を示します
- yii migrate/new all #すべての新しい移行を表示
- yii migrate/history #最後に適用された10個の移行を表示
- yii migrate/history 20 #最後に適用された20個の移行を表示
- yii migrate/history all #適用されたすべての移行を表示
特定のテーブルから列を追加または削除する必要がある場合があります。 * addColumn()および dropColumn()*メソッドを使用できます。
- ステップ1 *-新しい移行を作成します。
- ステップ2 *-新しく作成した移行ファイルをこの方法で変更します。
ここで、。/yii migrate *を実行すると、カテゴリテーブルがニューステーブルに追加されます。 逆に、。/yii migrate/down 1 *を実行すると、カテゴリ列は削除されます。
DB移行を実行する場合、各移行が成功または失敗したことを確認することが重要です。 DB操作をトランザクションで囲むことをお勧めします。 トランザクション移行を実装するには、* safeUp()および safeDown()*メソッドに移行コードを配置するだけです。 これらのメソッドのいずれかの操作が失敗すると、以前のすべての操作がロールバックされます。
「トランザクション方式」の前の例は次のようになります-
- * execute()*-生のSQLステートメントを実行します
- * createTable()*-テーブルを作成します
- * renameTable()*-テーブルの名前を変更
- * insert()*-単一の行を挿入します
- * batchInsert()*-複数の行を挿入
- * update()*-行を更新する
- * delete()*-行を削除します
- * addColumn()*-列を追加します
- * renameColumn()*-列の名前を変更します
- * dropColumn()*-列を削除します
- * alterColumn()*-列を変更します
- * dropTable()*-テーブルを削除します
- * truncateTable()*-テーブル内のすべての行を削除します
- * createIndex()*-インデックスを作成します
- * dropIndex()*-インデックスを削除します
- * addPrimaryKey()*-主キーを追加します
- * dropPrimaryKey()*-主キーを削除します
- * addForeignKey()*-外部キーを追加します
- * dropForeignKey()*-外部キーを削除します