CakePHP2でDBマイグレーションができるCakeDC migrationsプラグイン

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については下記が参考になります。

同じタグの記事: CakePHP
同じタグの記事: Linux
同じカテゴリの記事: Linux
関連書籍: CakePHP