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

Nei*_*eil 18 ruby mysql ruby-on-rails 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
Run Code Online (Sandbox Code Playgroud)

这是一个创建数据库表的基本迁移.但是:当我运行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

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

小智 31

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


小智 11

与ActiveRecord的迁移5.1最大的问题是,现在的ID预计将BIGINT代替INT,所以当你添加一列指创造了另一个表之前轨道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
Run Code Online (Sandbox Code Playgroud)

应该工作.


Nei*_*eil 5

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

日志文件中的错误消息并未完全指向该问题.出于某种原因,它可能是rails 5.1.1或可能是mysql2 0.4.6,但它不喜欢referencescreate_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
Run Code Online (Sandbox Code Playgroud)

对此:

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
Run Code Online (Sandbox Code Playgroud)

它奏效了.

这是非常奇怪的,因为references工作得很好sqlite3(我通过生成一个虚拟应用程序测试了这个,用一个references列运行了一个脚手架命令,然后运行rails db:migrate它一切正常).