Pocket
LINEで送る

なんかすごい手軽に利用できるもののいつもエラーになってまいっております。

そのテーブルは既に存在しますというエラーが発生します。

There was an error during a migration.
The error was: ‘Table “hoges” already exists in database.’
You must resolve the issue manually and try again.
All migrations have completed.

実際に小さい環境でためしてみます。

最初に使うときは、マイグレーション用のテーブルを作成します。
./cake Migirations.migration run all -p
これで、schema_migrationsというテーブルが作成されます。

次に最初のマイグレーションファイルを作成します。
その時、app/Config/Schema/schema.phpを削除しておく必要があります。
./cake Migrations.migration generate -f

そして、この状態のschema.phpを作成します。
./cake schema generate -f

これ以降、データベースを修正して、./cake Migrations.migration generate -fをして、マイグレーションファイルを作成していきます。その際に、schema.phpを作成しておかないと、差分のマイグレーションファイルは作成してくれません。schema.phpを作成しておけば、今のschema.phpを元のデータベースの状態と見なして、現状のデータベースの状態との差分をマイグレーションファイルの内容として適用するか聞いてきます。差分を適用して、schema.phpを更新したら、run upやrun downも問題なく実行できます。ですが、どうも変なデータベースの修正を行うと、微妙にエラーがでる見たいです。gitみたいな完全にすごいやつとまではいかない、かなりいい感じにすごいやつのようです。

あと、間違ってschema.phpをマイグレーションと関係ないところで変更してしまったり、更新しわすれたりすると変なことになるんだと思います。マイグレーションファイルを3ついい感じに作ってきたが、3つ目でスキーマファイルの更新を忘れた場合、2つ目の状態からの差分を4つ目のマイグレーションファイルの内容にしてしまうということは、割と簡単に起こるんじゃないかと思いました。その場合、プロジェクトで、他の誰かさんが、3つ目までのマイグレーションファイルを適用している状態で、4つ目を適用しようとすると、3つ目で作成した内容は既に存在するにも関わらず、4つ目でも作成しようとするので、すでにありますけど。。。というエラーが発生するものと思います。

これって結構間違いが起こりやすいプラグインだなあとも思いますが、どうなんでしょうか?

ところで、マイグレーションファイルを自分のデータベースに適用する際には、schema.phpというのは不要です。自分のデータベースの状態が、適用する全てのマイグレーションファイルの状態と不整合が起こらなければいいだけです。でも、勝手に何かのフィールドを追加したりしてしまうと、不整合が起こる可能性がでてきて、実際に不整合が起こるとエラーになります。複数人が別々にデータベースを修正して、勝手にコミットというかマイグレーションファイルの作成をしていると、簡単に不整合が起こるんじゃないかと思います。

便利だけどちょっと微妙な気がするんですが、知識不足ですので、なんかいい感じの使い方とか知識を教えてくれると幸いでございます。

Pocket
LINEで送る


コメントください

関連記事

プログラミング

Go言語によるビットコインのフルノード実装btcdを調べる(2)

btcdを実行した際のプログラムの流れを最初から確認してみます。 se 続きを読む …

プログラミング

Go – leveldb

Goで使えるLevelDB。 syndtr/goleveldb ドキュ 続きを読む …

%d人のブロガーが「いいね」をつけました。