迁移到创建表引发Mysql2 ::错误:表不存在

时间:2017-06-14 16:25:26

标签: mysql ruby-on-rails ruby mysql2

我用以下内容编写了一个迁移:

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 ::错误:表'my_database.some_tables'不存在:显示来自'some_tables'的完整字段

好像错误说它无法创建表,因为表确实存在,这没有意义。

我看过并试过的事情:

  • 回顾了database.yml,看起来很好。什么都没有改变,我最近运行其他迁移就好了(虽然没有创建数据库表的迁移)
  • 运行bundle以确保已安装所有宝石
  • 删除了schema.rb文件,使用另一个副本中的数据重新创建了数据库,然后我运行了rake db:schema:dump来重新创建schema.rb文件。我试图再次运行迁移,但仍然遇到了同样的错误。

我正在使用rails 5.1.1以及mysql2 0.4.6

有关如何让迁移运行的任何提示?

4 个答案:

答案 0 :(得分:29)

我在尝试创建一个新模型时遇到了类似的错误,该模型引用了在迁移到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

答案 1 :(得分:10)

ActiveRecord迁移5.1的一个大问题是现在id应该是BIGINT而不是INT,所以当你添加一个列引用在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

应该有用。

答案 2 :(得分:5)

我想出了一个解决方法,但对我来说仍然非常令人费解。

日志文件中的错误消息并未完全指向该问题。出于某种原因,它可能是@ImportResource或可能是@Primary,但由于某种原因,它不喜欢在rails 5.1.1块中使用mysql2 0.4.6。很奇怪,因为它过去对我有用。

所以我改变了迁移:

references

对此:

create_table

它有效。

这很奇怪,因为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 的效果很好(我通过生成虚拟应用程序测试了这个,运行了带references列的脚手架命令,然后运行{{1这一切都奏效了。

答案 3 :(得分:0)

这让我疯了,我想我看到了与其他人建议不同的原因。在我的情况下,它发生的原因是我的迁移文件名与其中的迁移类完全匹配。例如,我有一个名为20171205232654_bonus.rb的迁移文件,但在类中声明为class CreateBonus < ActiveRecord::Migration[5.1]。将文件名更改为20171205232654_create_bonus.rb后,一切正常。

这可能与我一直在创建迁移的事实有关,而不是完整的支架,也许我做错了。我真的不知道我是如何结束这种不匹配的。