CakeDC/migrations · GitHubが便利そうなので調べてみました。CakePHP2.4以降をサポートしているそうです。CakePHP2系でマイグレーションを利用する方法 | Ryuzee.comも参考にしました。
「CakePHP 2.4.6 でユーザ管理アプリを作る方法 : hiro345」でユーザ管理アプリを作ってから、試してみました。
プラグインのインストール
プラグインのインストールは簡単です。
$ wget -O cakedc_migrations_2.2.3.zip https://github.com/CakeDC/migrations/archive/2.2.3.zip $ unzip cakedc_migrations_2.2.3.zip $ mv migrations-2.2.3/ app/Plugin/Migrations
利用できるようにするには、ロード処理が必要です。
$ tail -1 app/Config/bootstrap.php CakePlugin::load('Migrations');
初期設定
Migrationプラグインの利用開始のために、DB に表 schema_migrations を作成します。
$ cd app $ Console/cake Migrations.migration run all -p Migrations
確認します。schema_migrationsが増えている事がわかります。
$ echo "show tables;" | mysql -u root user_app_v246 Tables_in_user_app_v246 schema_migrations users
マイグレーション用初期ファイル作成します。Config/Schema/schema.phpがあるとうまく作成されないので、同名の
ファイルがある場合は別名にしておきます。
$ Console/cake Migrations.migration generate -f Cake Migration Shell --------------------------------------------------------------- Do you want generate a dump from current database? (y/n) [y] > y --------------------------------------------------------------- Generating dump from current database... Do you want to preview the file before generation? (y/n) [y] > n Please enter the descriptive name of the migration to generate: > init Generating Migration... Done.
これで、Config/Migrationディレクトリにマイグレーション用ファイルが生成されます。
$ ls Config/Migration/ 1395294046_init.php
次に Config/Schema/schema.phpを作成します。
$ sudo Console/cake schema generate -f Welcome to CakePHP v2.4.6 Console --------------------------------------------------------------- App : app Path: /var/www/cakephp2_apps/cakephp-2.4.6_apps/user_app/app/ --------------------------------------------------------------- Cake Schema Shell --------------------------------------------------------------- Generating Schema... Schema file: schema.php generated
確認します。
$ ls Config/Schema/schema.php Config/Schema/schema.php
ここまででDBマイグレーションができる準備ができました。状態を確認しておくと良いでしょう。
$ sudo Console/cake Migrations.migration status
マイグレーションの手順
テーブルに変更を加えたら、マイグレーションファイルを生成
$ Console/cake Migrations.migration generate -f
適用するには、下記コマンドを実行。適用可能なマイグレーションの一覧が表示されるので、適用するものを選択して指定。
$ sudo Console/cake Migrations.migration run
他にも下記のようなコマンドがあります。
$ sudo Console/cake Migrations.migration run all $ sudo Console/cake Migrations.migration run reset $ sudo Console/cake Migrations.migration run up $ sudo Console/cake Migrations.migration run down
Jenkinsなどで自動で適用するには下記を指定して実行すれば良いようです。
$ ./Console/cake Migrations.migration run all -p
例
例としてtasksテーブルを追加してみます。
$ cat ~/tasks.sql CREATE TABLE `tasks` ( `id` int(11) NOT NULL AUTO_INCREMENT, `subject` tinytext COLLATE utf8_unicode_ci NOT NULL, `content` text COLLATE utf8_unicode_ci NOT NULL, `created` datetime NOT NULL, `modified` datetime NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
mysqlコマンドを使ってテーブルを追加します。
$ cat ~/tasks.sql | mysql -u root user_app_v246 ----
DBへ変更を加えたのでマイグレーションをします。
$ sudo Console/cake Migrations.migration generate -f Cake Migration Shell --------------------------------------------------------------- Do you want compare the schema.php file to the database? (y/n) [y] > --------------------------------------------------------------- Comparing schema.php to the database... Do you want to preview the file before generation? (y/n) [y] > n Please enter the descriptive name of the migration to generate: > add_table_tasks Generating Migration... Done. Do you want update the schema.php file? (y/n) [y] > y Welcome to CakePHP v2.4.6 Console --------------------------------------------------------------- App : app Path: /var/www/cakephp2_apps/cakephp-2.4.6_apps/user_app/app/ --------------------------------------------------------------- Cake Schema Shell --------------------------------------------------------------- Generating Schema... Schema file exists. [O]verwrite [S]napshot [Q]uit Would you like to do? (o/s/q) [s] > o Schema file: schema.php generated
これでマイグレーションが完了です。schema.phpは最後にOverwriteのoを指定しているので上書き更新されています。
前のDBへ戻す
down を使うとひとつ戻ります。
$ sudo Console/cake Migrations.migration run down Cake Migration Shell --------------------------------------------------------------- Running migrations: [1395293140] 1395293140_add_table_tasks > Dropping table tasks. --------------------------------------------------------------- All migrations have completed.
確認すると、tasksテーブルが存在していないことがわかります。
$ echo 'show tables;'|mysql -u root user_app_v246 Tables_in_user_app_v246 schema_migrations users
DBを先へ進める
up するとひとつ進みます。
$ sudo Console/cake Migrations.migration run up Cake Migration Shell --------------------------------------------------------------- Running migrations: [1395293140] 1395293140_add_table_tasks > Creating table tasks. --------------------------------------------------------------- All migrations have completed.
確認すると、tasksテーブルが存在してます。
$ echo 'show tables;'|mysql -u root user_app_v246 Tables_in_user_app_v246 schema_migrations tasks users
追加ではなく変更も出来ます。tasksテーブルへカラムを追加するには下記のようなSQL文を用意して実行します。
$ cat ~/tasks_alter_v1.sql ALTER TABLE `tasks` ADD `status` INT NOT NULL DEFAULT '0' AFTER `content`, ADD `due_date` DATE NULL DEFAULT NULL AFTER `status`;
PHP, CakePHPについては下記が参考になります。
- パーフェクトPHP
- Webサイト制作者のための PHP入門講座
- PHP 逆引きレシピ
- PHPによるWordPressカスタマイズブック―3.x対応
- Webアプリ開発を加速する CakePHP2定番レシピ119
- CakePHP2 実践入門 (WEB+DB PRESS plus)
- 詳解CakePHP辞典―2.0/2.1/2.2/2.3対応
- CakePHP ポケットリファレンス (Pocket Reference)