webエンジニアの日常

RubyやPython, JSなど、IT関連の記事を書いています

Mysql2::Error: Unknown tableといわれたら

こんにちは、エンジニアのさもです

Railsをやっていると、マイグレーションを書いて、しょっちゅうDBを編集したり、テーブル追加したりしますよね。

Railsでは、

rake db:rollback

とすると、今実行されたマイグレーションの中で最新のものを巻き戻してくれます。

ですが、

スポンサーリンク

rake aborted!
StandardError: An error has occurred, all later migrations canceled:

Mysql2::Error: Unknown table 'myapp_development.users': DROP TABLE `users`

と表示されたことはないでしょうか?

これは、何らかの手違いで、テーブルが存在しないのに、テーブルを消そうとしたときに表示されるエラーです。

こんなときは、マイグレーションファイルを次のように修正すれば大丈夫です

  • 修正前
class CreateUsers < ActiveRecord::Migration
  def change
    create_table :users do |t|
      t.string   :name, limit: 50

      t.timestamps null: false
      t.datetime :deleted_at
    end
  end
end
  • 修正後
class CreateUsers < ActiveRecord::Migration
  def up
    create_table :users do |t|
      t.string   :name, limit: 50

      t.timestamps null: false
      t.datetime :deleted_at
    end
  end

  def down
  end
end

メソッド名をchangeからupに変えて、空のdownメソッドを追加しました。

upとdownはセットで記述してください

このメソッドは何かというと、

です。

修正後、rake db:rollbackしたら、マイグレーションファイルは戻しておいてください

普通、テーブルを変更するときはchangeメソッドですが、changeメソッドで定義された場合、以前の状態がわからないとロールバックできません。

以前の状態を記述しておくのがdownメソッドです。

カラム追加やテーブル追加など、以前の状態が明らかな場合はいいですが、カラム削除などの場合はup,downで書くようにしましょう。

読者登録をしていただけると、ブログを続ける励みになりますので、よろしくお願いします。