web-dev-qa-db-ja.com

テーブルを作成するための移行でMysql2 :: Errorが発生する:テーブルが存在しない

私は次のように移行を書きました:

class CreateTableSomeTable < ActiveRecord::Migration[5.1]
  def change
    create_table :some_tables do |t|
      t.references :user, foreign_key: true
      t.references :author, references: :user, foreign_key: true
      t.text :summary
    end
  end
end

これは、データベーステーブルを作成する基本的な移行です。ただし、Rails db:migrateを実行すると、非常に奇妙なエラーメッセージが移行を中止します。

Mysql2 :: Error:テーブル 'my_database.some_tables'は存在しません:SHOW FULL FIELDS FROM 'some_tables'

これは、テーブルが存在するためにテーブルを作成できないというエラーが表示されているかのようで、これは意味がありません。

私が見て試したもの:

  • 正常に見えるdatabase.ymlを確認しました。何も変更されていません。最近、他の移行を問題なく実行しました(データベーステーブルを作成する移行はありません)
  • bundleを実行して、すべてのgemがインストールされたことを確認しました
  • schema.rbファイルを削除し、別のコピーのデータを使用してデータベースを再作成し、rake db:schema:dumpを実行してschema.rbファイルを再作成しました。もう一度移行を実行しようとしたところ、同じエラーが発生しました。

Rails 5.1.1mysql2 0.4.6を使用しています

移行を実行するためのヒントはありますか?

19
Neil

私は回避策を見つけましたが、それでも私には非常に戸惑っています。

ログファイルのエラーメッセージは、問題を正確に示していませんでした。何らかの理由で、それはRails 5.1.1またはmysql2 0.4.6である可能性がありますが、何らかの理由でcreate_tableブロック内でreferencesを使用するのは好ましくありません。それは過去に私のために働いたので非常に奇妙です。

だから私はこれから移行を変更しました:

class CreateTableSomeTable < ActiveRecord::Migration[5.1]
  def change
    create_table :some_tables do |t|
      t.references :user, foreign_key: true
      t.references :author, references: :user, foreign_key: true
      t.text :summary
    end
  end
end

これに:

class CreateTableSomeTable < ActiveRecord::Migration[5.1]
  def change
    create_table :some_tables do |t|
      t.integer :user_id
      t.integer :author_id
      t.text :summary
    end
  end
end

そしてそれはうまくいった。

referencessqlite3で問題なく動作するため、非常に奇妙です(私は、ダミーアプリを生成してこれをテストし、references列を使用してscaffoldコマンドを実行し、Rails db:migrateを実行して、すべてが機能しました)。

5
Neil

Rails 5.1。に移行する前に作成された既存のモデルへの参照を持つ新しいモデルを作成しようとすると、同様のエラーが発生しました。

エラーメッセージはそれほど明確ではありませんでしたが、私の場合、問題は古いモデルの主キーと新しいモデルの外部キーの間のデータ型の不一致であることが判明しました(MySQLでは許可されていません)。 Rails 5.1以降、すべての主キーと外部キーのデフォルトのデータ型はbigintですが、古いモデルの場合、主キーの型はまだ整数でした。

現在のモデルのすべての主キーと外部キーをbigintに変換することでこれを解決したので、Rails新しいデフォルトを使用して、それを忘れることができます。

回避策として、新しい外部キーに整数タイプを指定して、古いモデルの主キータイプと一致させることもできます。次のようなもの:

class CreateUserImages < ActiveRecord::Migration[5.1]
  def change
    create_table :user_images do |t|
      t.references :user, type: :integer, foreign_key: true
      t.string :url
    end
  end
end
29
Marcis Viskints

ActiveRecordマイグレーション5.1の大きな問題は、IDがINTではなくBIGINTであることが期待されることです。そのため、Rails 5.1以前に作成された別のテーブルを参照する列を追加すると、列タイプがBIGINTであるが、代わりに単なるINTであるため、エラーが発生する最善の解決策は、マイグレーションを変更して列のタイプをintに変更することです。

class CreateTableSomeTable < ActiveRecord::Migration[5.1]
 def change
  create_table :some_tables do |t|
   t.references :user, foreign_key: true, type: :int
   t.references :author, references: :user, foreign_key: true
   t.text :summary
  end
end

それはうまくいくはずです。

10
helmutrs

これは私を狂わせました、私はこれについて他の人が示唆したものとは異なる理由を見ていたと思います。私の場合、移行ファイル名がその中の移行クラスと正確に一致しなかったために起こりました。たとえば、20171205232654_bonus.rbという名前の移行ファイルがありましたが、クラス内ではclass CreateBonus < ActiveRecord::Migration[5.1]と宣言されていました。ファイル名を20171205232654_create_bonus.rbに変更すると、すべてが機能しました。

これは、完全な足場ではなく、マイグレーションのみを作成しているという事実に関係している可能性があります。どうしてそのミスマッチに巻き込まれたのか本当にわかりません。

0
Adam Ehven