fuelphp のマイグレーションについて 挙動が実行毎に異なる。

瀏覽次數:532 次
跳到第一則未讀訊息

Ryosuke Yoshinari

未讀,
2016年7月11日 晚上11:52:282016/7/11
收件者:fuelphp.jp
お世話になっております。

fuelphp のマイグレーションについて、不可解な点があります。
長くなります。すみません。

マイグレーションファイルを以下のように12個作成し、

001_create_customers.php
002_create_crammers.php
003_create_crammerhistories.php
004_create_users.php
005_create_statushistories.php
006_create_bankaccounts.php
007_create_banks.php
008_create_bankbranches.php
009_create_courses.php
010_create_courseselects.php
011_create_memos.php
012_create_enquetes.php

中身はそれぞれ

 public function up() {
   \DBUtil::create_table('customers', array(


 public function down() {
   \DBUtil::drop_table('customers');

となっています。

ここで
php oil refine migrate
を実行すると、

Performed migrations for app:default:
003_create_crammerhistories
004_create_users
005_create_statushistories
006_create_bankaccounts
007_create_banks
008_create_bankbranches
009_create_courses
010_create_courseselects
011_create_memos
012_create_enquetes

となり、
001番と002番が作成されないのです。

続いて、
php oil refine migrate:current
を実行すると、

Newly installed migrations for app:default:
- 001_create_customers
- 002_create_crammers

と表示され、目的のcustomersとcrammersはマイグレーションできるのですが、

app/config/development/migrations.php

の中をのぞくと、

(前略)
    'app' => 
    array (
      'default' => 
      array (
        0 => '001_create_customers',
        1 => '002_create_crammers',
        2 => '002_create_customers',
        3 => '003_create_crammerhistories',
        4 => '004_create_users',
        5 => '005_create_statushistories',
        6 => '006_create_bankaccounts',
        7 => '007_create_banks',
        8 => '008_create_bankbranches',
        9 => '009_create_courses',
        10 => '010_create_courseselects',
        11 => '011_create_memos',
        12 => '012_create_enquetes',
      ),
    ),
(後略)

となり、customersが2重に表れて、しかも接頭辞の番号が異なります。

また、fuelphpを使って3人で開発を進めておりまして、
ときどきマイグレーションファイルを書き換えるのです。

(マイグレーションファイルを書き換える方法があってるかどうかも問題ですが)

そのとき、以下のようなバッチファイルを作成しまして、データベースの更新を
一括で行いたいのですが、

php oil refine migrate:down -v=0
php oil refine migrate
php oil refine migrate:current (currentを指定しないと001,002が生成されない)
データ読み込み

肝心の、データベースを全部一度ドロップする部分の
php oil refine migrate:down -v=0

が、
Reverted migrations for app:default:
- 012_create_enquetes
- 011_create_memos
- 010_create_courseselects
- 009_create_courses
- 008_create_bankbranches
- 007_create_banks
- 006_create_bankaccounts
- 005_create_statushistories
- 004_create_users
- 003_create_crammerhistories
- 002_create_crammers
- 001_create_customers

と、うまくいく場合と、

Reverted migrations for app:default:
- 001_create_customers

と一行だけ表示され、全部がドロップされないケースがあります。

自分がマイグレーションについて理解が浅いものですから、
どうしてこのようになるのかわかりません。

お知恵をお貸しいただければ幸いに存じます。

kit.t

未讀,
2016年7月14日 凌晨12:24:192016/7/14
收件者:fuelphp.jp
kit.tです。

migrateはconfig/(指定環境による)/migrations.phpとデータベース上のmigrationテーブルの両方を参照し、
最新のバージョンからのみ更新します。

migration:currentはmigrationテーブルとマイグレーションファイルを確認して、バージョンの抜けがあれば補完して更新します。

config/migrations.phpは更新内容に応じてではなく、migrationテーブルの状況を元に書き出されます。


以上を踏まえて事例を推測すると、
作業前のmigrationテーブル上に下記のデータが入ってしまっていると思います。
'002_create_customers',

php oil refine migrate
> 002が存在するので003からのマイグレーションを行う。

php oil refine migrate:current
> 001、002のレコードとファイルが対応していないので、実行されていないものとして更新を行う。

という事ではないかと思います。

肝心の、データベースを全部一度ドロップする部分の
php oil refine migrate:down -v=0
が、
Reverted migrations for app:default:
- 012_create_enquetes
- 011_create_memos
- 010_create_courseselects
- 009_create_courses
- 008_create_bankbranches
- 007_create_banks
- 006_create_bankaccounts
- 005_create_statushistories
- 004_create_users
- 003_create_crammerhistories
- 002_create_crammers
- 001_create_customers
と、うまくいく場合と、
Reverted migrations for app:default:
- 001_create_customers
と一行だけ表示され、全部がドロップされないケースがあります。

これはconfig/migration.phpとmigrationテーブルのデータが一致してないために起こると思います。

開発環境のデータベースをダンプから再構成する場合や、config/migrations.phpも含めてコピーしている場合に起こりそうな気がします。

Ryosuke Yoshinari

未讀,
2016年7月14日 晚上10:02:152016/7/14
收件者:fuelphp.jp
お世話になっております。
migrationテーブルの中をのぞいてみたら
確かにゴミが残ってしまっていました。

一度migrationテーブルの中をきれいにして、
config/migration.php の中身をきれいにしましたら、

php oil refine migrateをしただけで1番から12番までのテーブルがうまく作成されました

ありがとうございました。
回覆所有人
回覆作者
轉寄
0 則新訊息