m_shige1979のときどきITブログ

プログラムの勉強をしながら学習したことや経験したことをぼそぼそと書いていきます

Github(変なおっさんの顔でるので気をつけてね)

https://github.com/mshige1979

cakephp3のmigrations2

ちょっと前回はあれなんで


cakephp3のmigrations - m_shige1979のささやかな抵抗と欲望の日々

1個マイグレーションファイルを作成しても

で?

と思ったのでもう少しやってみる

やったこと

  1. 初回作成
  2. テーブルに項目追加
  3. テーブルに項目削除、新規テーブル作成
  4. ロールバック

初回作成

マイグレーションファイルを作成
$ sh app/bin/cake migrations create Initial

Welcome to CakePHP v3.0.0-beta2 Console
---------------------------------------------------------------
App : src
Path: /vagrant/projects/beta2/app/src/
---------------------------------------------------------------
using migration path /vagrant/projects/beta2/app/config/Migrations
created ./app/config/Migrations/20141016121505_initial.php
$

マイグレーション名はキャメルケースなんで小文字はだめらしい

20141016121505_initial.php
<?php

use Phinx\Migration\AbstractMigration;

class Initial extends AbstractMigration
{
    /**
     * Change Method.
     *
     * More information on this method is available here:
     * http://docs.phinx.org/en/latest/migrations.html#the-change-method
     *
     * Uncomment this method if you would like to use it.
     *
    public function change()
    {
    }
    */
    
    /**
     * Migrate Up.
     */
    public function up()
    {
        $sample1 = $this->table("sample1");
        $sample1
            ->addColumn("name", "string", array("limit" => 128))
            ->addColumn("deleted", "integer")
            ->addColumn("created", "datetime")
            ->addColumn("modified", "datetime")
            ->create()
            ;
    }

    /**
     * Migrate Down.
     */
    public function down()
    {

    }
}

※簡単にテーブルを作成する

実行
$ sh app/bin/cake migrations migrate

Welcome to CakePHP v3.0.0-beta2 Console
---------------------------------------------------------------
App : src
Path: /vagrant/projects/beta2/app/src/
---------------------------------------------------------------
using migration path /vagrant/projects/beta2/app/config/Migrations
using environment default
using adapter mysql
using database my_app

 == 20141016121505 Initial: migrating
 == 20141016121505 Initial: migrated 0.0321s

All Done. Took 0.0578s
$

※「20141016121505」が実行タイムスタンプ

DB内容

f:id:m_shige1979:20141016213523p:plain
f:id:m_shige1979:20141016213647p:plain

2回目

マイグレーションを作成
$ sh app/bin/cake migrations create Sample1

Welcome to CakePHP v3.0.0-beta2 Console
---------------------------------------------------------------
App : src
Path: /vagrant/projects/beta2/app/src/
---------------------------------------------------------------
using migration path /vagrant/projects/beta2/app/config/Migrations
created ./app/config/Migrations/20141016124037_sample1.php
$
20141016124037_sample1.php
<?php

use Phinx\Migration\AbstractMigration;

class Sample1 extends AbstractMigration
{
    /**
     * Change Method.
     *
     * More information on this method is available here:
     * http://docs.phinx.org/en/latest/migrations.html#the-change-method
     *
     * Uncomment this method if you would like to use it.
     *
    public function change()
    {
    }
    */
    
    /**
     * Migrate Up.
     */
    public function up()
    {
        $sample1 = $this->table("sample1");
        $sample1
            ->addColumn("age", "integer")
            ->addColumn("sex", "integer")
            ->save()
            ;
    }

    /**
     * Migrate Down.
     */
    public function down()
    {

    }
}
マイグレーション
$ sh app/bin/cake migrations migrate

Welcome to CakePHP v3.0.0-beta2 Console
---------------------------------------------------------------
App : src
Path: /vagrant/projects/beta2/app/src/
---------------------------------------------------------------
using migration path /vagrant/projects/beta2/app/config/Migrations
using environment default
using adapter mysql
using database my_app

 == 20141016124037 Sample1: migrating
 == 20141016124037 Sample1: migrated 0.0791s

All Done. Took 0.0988s
$
結果

f:id:m_shige1979:20141016214647p:plain
f:id:m_shige1979:20141016214721p:plain

3回目

マイグレーションファイルを作成
$ sh app/bin/cake migrations create Sample2

Welcome to CakePHP v3.0.0-beta2 Console
---------------------------------------------------------------
App : src
Path: /vagrant/projects/beta2/app/src/
---------------------------------------------------------------
using migration path /vagrant/projects/beta2/app/config/Migrations
created ./app/config/Migrations/20141016125733_sample2.php
$
20141016125733_sample2.php
<?php

use Phinx\Migration\AbstractMigration;

class Sample2 extends AbstractMigration
{
    /**
     * Change Method.
     *
     * More information on this method is available here:
     * http://docs.phinx.org/en/latest/migrations.html#the-change-method
     *
     * Uncomment this method if you would like to use it.
     *
    public function change()
    {
    }
    */
    
    /**
     * Migrate Up.
     */
    public function up()
    {

        // 変更
        $sample1 = $this->table("sample1");
        $sample1
            ->removeColumn("age")
            ->renameColumn("sex", "seibetsu")
            ->addColumn("memo", "string")
            ->save()
        ;

        // テーブル作成
        $sample2 = $this->table("sample2");
        $sample2
            ->addColumn("name", "string", array("limit" => 256))
            ->addColumn("memo", "string")
            ->addColumn("memo2", "string")
            ->addColumn("deleted", "integer")
            ->addColumn("created", "datetime")
            ->addColumn("modified", "datetime")
            ->create()
        ;
    }

    /**
     * Migrate Down.
     */
    public function down()
    {

    }
}
実行
$ sh app/bin/cake migrations migrate

Welcome to CakePHP v3.0.0-beta2 Console
---------------------------------------------------------------
App : src
Path: /vagrant/projects/beta2/app/src/
---------------------------------------------------------------
using migration path /vagrant/projects/beta2/app/config/Migrations
using environment default
using adapter mysql
using database my_app

 == 20141016125733 Sample2: migrating
 == 20141016125733 Sample2: migrated 0.0860s

All Done. Took 0.1146s
$ 
結果

f:id:m_shige1979:20141016221154p:plain
f:id:m_shige1979:20141016221230p:plain
f:id:m_shige1979:20141016221310p:plain
※新しいテーブルも追加されている

ロールバック

したらどうなる

実行
$ sh app/bin/cake migrations rollback

Welcome to CakePHP v3.0.0-beta2 Console
---------------------------------------------------------------
App : src
Path: /vagrant/projects/beta2/app/src/
---------------------------------------------------------------
using migration path /vagrant/projects/beta2/app/config/Migrations
using environment default
using adapter mysql
using database my_app

 == 20141016125733 Sample2: reverting
 == 20141016125733 Sample2: reverted 0.0020s

All Done. Took 0.0259s
$
結果

f:id:m_shige1979:20141016221717p:plain
※前回実行したテーブルの定義は変わらないけど前回実行した履歴がなくなるのでやり直すことができる

まとめ

所感

データベースのクライアントツールsqlで定義を修正し直すのが嫌な人は楽になりそう。
また、デプロイ時にテーブルにテーブルの定義を多少簡単にできる、
追加位置や設定パラメータがどこまで対応できるかもう少し調査してみる。