質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.34%

  • Ruby

    8183questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

  • Ruby on Rails

    7666questions

    Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

  • Docker

    805questions

    Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

dockerのdatastoreで正しく復元されているRailsアプリケーションで、Migration are pendingエラーが発生する場合の対処法

解決済

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 559

hrmths

score 11

 前提 

  • docker for MACで開発中
  • コンテナは、web(rails)、mysql、datastore(busybox)

 起きている事象 

  • dockerコンテナを全てstopして、再度起動docker-compose upすると、datastoreのデータからdbをリストアしてくれる。
  • コンテナが立ち上がった状態でlocalhostでアクセスしようとすると、Migrations are pending. To resolve this issue, run: bin/rake db:migrate RAILS_ENV=development というエラーが発生

そもそもなのですが、なぜMigration are pendingになっているのかわからずでして。。
もしかしたら以前、この質問でやったみたいに、schema.rb からリストアしたのが問題でしょうか?

試しにrails db:migrateをしてみると以下のようなエラーがでます。

root@xxxxxxxxxxx:/myapp# bin/rake db:migrate RAILS_ENV=development
== 20160830225620 CreateUsers: migrating ======================================
-- create_table(:users)
rake aborted!
StandardError: An error has occurred, all later migrations canceled:

Mysql2::Error: Table 'users' already exists: CREATE TABLE `users` (`id` int(11) auto_increment PRIMARY KEY, `name` varchar(255), `created_at` datetime NOT NULL, `updated_at` datetime NOT NULL) ENGINE=InnoDB ROW_FORMAT=DYNAMIC

これを見る限り、migrationファイルも最初から流すわけではなく、途中から実行されエラーになっているようです。(20160830225620 CreateUsersは後半のmigrationファイルという意味です)

このような場合、どのように対応するのがよいでしょうか?
20160830225620 CreateUsers このmigrationファイル以降で、実行しているテーブルやカラムを、一度削除した上で、rails db:migrateを実行するしかないでしょうか。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

こんにちは。

Docker (Dockerのdatastore)の問題というよりは、schema.rb を使ってテーブルを復元した状態で、さらに db:migrateをしようとしたことが問題かなと思います。

トラブル前は、hrmthsさんはrailsのgenerate model / migrationコマンドを使ってテーブルを作成されていたかと思います。

その場合は、20160830225620_create_users.rb というファイルが出来て、rake db:migrate を使ってDBに対してテーブルを作成、もしくは変更...という流れですよね。

rake db:migrate の時は、schema_migrations というテーブルが自動で作成されて、そこにmigrationの履歴用の値がセットされます。

Usersテーブルができた場合は、20160830225620 という値が入ります。
そのほかのテーブルに関しても、migrationのファイルに付いている日付の値が、schema_migrationsテーブルに登録されていきます。


ここまではご周知かと思います。

さて、トラブルでDBを空っぽの状態から再作成されたとのことですが...。

rake db:reset の際に、schema.rb を使ってのテーブルの復元だと、1つのファイルで一気にテーブルを作成しますので、schema_migrationsのテーブルには、0 という値だけがセットされます。

つまり、rake db:migrate を行なったときとほぼ同じ構造のテーブルは作成されるものの、schema_migrations (マイグレーションの記録)は 0 スタートになります。

この状態で、rake db:migrate をしようとすると、20160830225620_create_users.rb が読み込まれたときに、20160830225620 という値が入っていないため、Railsは「まだこのテーブルは作成されてないな」と判断して、creaate tableを実施しようとします。

ここで、Mysql2::Error: Table 'users' already exists で怒られてしまうのだと思います。

sqliteとかの簡単なDBに対して、rake db:reset -> rake db:migrate を実施すると、同じエラーが再現されるのではないでしょうか。


ひとまずなんとかしたい場合は、こんな方法もありです。

  1. 別な綺麗な環境で rake db:migrate して、ひとととおりテーブルを作成
    (db:reset ではなくて、db:drop / db:cretae / db:migrate )
  2. schema_migrations に記録されている値を問題のDB側にコピーしてあげる

多分これでその後のrake db:migrate はエラーにならないと思います。
また、新規のDBに対してテーブル作成(migration)をする際は、db:reset -> db:migrateは行わず、db:create -> db:migrate をすれば大丈夫だと思います。

このへんも参考までに:
http://d.hatena.ne.jp/yk5656/20140102/1388614850

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/21 08:06

    suamaさん、とてもわかりやすいご説明ありがとうございます。
    `schema_migrations` で記録しているのですね。ということは、エラーが発生した以降のmigrationファイルの数字の部分を、`schema migrations` に追加したらクリアしそうですね(migration済みと扱われる)。

    キャンセル

  • 2017/02/21 08:14

    立て続けにすみません。一応エラーは発生しなくなったのですが、これってありなんですかね、、?

    >でもmigrationファイルがずれたというか、最初から流しても正しくDBができないような形になってしまいました。migrationファイルを一度全部消して、schema.rbを見ながら、正規化してつくりなおすというのはありなんでしょうか?

    キャンセル

  • 2017/02/21 08:18

    schema.rb (& rake db:load) だけを使い、rake db:migrateを使わないケースとしてはspecなどテスト用のDBをささっと作るときとか、新規にrailsでテーブルを作りながら管理するのではなくて、既存のテーブルを利用しつつrailsに置き換えて行くときなどかな、と思います。
    一式すでに固まった構成がある場合はschema.rbに記載、version = 0で作成し、その後追加していく際はmigrationのファイルを追加していくとか。

    キャンセル

  • 2017/02/21 08:22

    入れ違いですみません。
    > migrationファイルを一度全部消して、schema.rbを見ながら、正規化してつくりなおすというのはありなんでしょうか?

    上記で添えたように、「すでにテーブルが一式あって別のフレームワークで動いていたシステムをrailsに置き換える」とか、開発段階ではとりあえずmigrationでガンガン作っていってある程度Fixしたら整理し直すことはたくさんあると思いますので、いろんなケースがあるのかなあと思います。

    マイグレーションが面倒なので、別のgemを使ったりすることもありますし...。

    キャンセル

  • 2017/02/21 08:23

    >一式すでに固まった構成がある場合はschema.rbに記載、version = 0で作成し、その後追加していく際はmigrationのファイルを追加していくとか。

    なるほどです!そういうことが可能なのですね。勉強になりました。ありがとうございます!

    キャンセル

  • 2017/02/21 08:29

    >上記で添えたように、「すでにテーブルが一式あって別のフレームワークで動いていたシステムをrailsに置き換える」とか、開発段階ではとりあえずmigrationでガンガン作っていってある程度Fixしたら整理し直すことはたくさんあると思いますので、いろんなケースがあるのかなあと思います。

    そうなんですね。migration一度整理してみます。ありがとうございますmm

    キャンセル

0

20160830225620 CreateUsers このmigrationファイル以降で、実行しているテーブルやカラムを、一度削除した上で、rails db:migrateを実行するしかないでしょうか。


これをやり、解決しました。でもmigrationファイルがずれたというか、最初から流しても正しくDBができないような形になってしまいました。migrationファイルを一度全部消して、schema.rbを見ながら、正規化してつくりなおすというのはありなんでしょうか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.34%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Ruby

    8183questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

  • Ruby on Rails

    7666questions

    Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

  • Docker

    805questions

    Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

  • トップ
  • Rubyに関する質問
  • dockerのdatastoreで正しく復元されているRailsアプリケーションで、Migration are pendingエラーが発生する場合の対処法