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

迁移到创建表会引发Mysql2::错误:表不';不存在,mysql,ruby-on-rails,ruby,mysql2,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 :s

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

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 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
class CreateTableSomeTable
创建数据库表是一种基本的迁移。但是:当我运行
rails db:migrate
时,一条非常奇怪的错误消息中止了迁移:

Mysql2::错误:表“my_database.some_tables”不存在:显示“some_tables”中的完整字段

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

我看过并尝试过的事情:

  • 查看了database.yml,看起来不错。没有任何变化,我最近也运行了其他迁移(尽管没有创建数据库表的迁移)
  • 运行
    bundle
    以确保安装了所有gems
  • 删除了
    schema.rb
    文件,用另一个副本中的数据重新创建了数据库,我运行了
    rake db:schema:dump
    来重新创建
    schema.rb
    文件。我试图再次运行迁移,但仍然收到相同的错误
我使用的是
rails5.1.1
以及
mysql20.4.6


关于如何运行迁移,有什么建议吗?

我找到了一个解决办法,但这对我来说仍然很困惑

日志文件中的错误消息并非完全指向问题。出于某种原因,它可能是
rails 5.1.1
,也可能是
mysql2 0.4.6
,但出于某种原因,它不喜欢在
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
为此:

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
class CreateTableSomeTable
它成功了


这很奇怪,因为
references
sqlite3
配合得很好(我通过生成一个虚拟应用程序来测试它,用
references
列运行scaffold命令,然后运行
rails db:migrate
,一切都正常)

我在尝试创建一个新模型时遇到了类似的错误,该模型引用了迁移到Rails 5.1之前创建的现有模型

虽然错误消息对此不是很清楚,但在我的例子中,问题是旧模型的主键和新模型的外键之间的数据类型不匹配(MySQL不允许这样)。这是因为自Rails5.1以来,所有主键和外键的默认数据类型都是bigint,但对于旧模型,主键类型仍然是integer

我通过将当前模型的所有主键和外键转换为bigint解决了这个问题,这样我就可以使用Rails新的默认值,而不用考虑它了

解决方法还可以是为新外键指定整数类型,以便它们与旧模型的主键类型匹配。如下所示:

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 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
class CreateUserImages
这让我发疯,我想我看到的原因与其他人提出的不同。在我的例子中,发生这种情况是因为我的迁移文件名与其中的迁移类不完全匹配。例如,我有一个名为
20171205232654_bonus.rb
的迁移文件,但在类中被声明为
class CreateBonus
。有一次,我将文件名更改为
20171205232654_create_bonus.rb
一切正常


这可能与我只创建了迁移,而不是完整的支架有关,也许我做错了什么。我真的不知道我怎么会有这种不匹配

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
class CreateTableSomeTable

这应该是可行的。

看起来您的鸭子排成了一行,所以这可能是一个多余的问题,但是:您是否验证了是这种特定的迁移导致了问题,例如,在迁移中放入调试代码,或者使用环境变量只运行一次迁移?运行迁移时,日志文件中显示的与此表相关的内容是什么?请尝试运行
rake db:migrate:status
以查看已应用于数据库的迁移。可能您发现您正在连接到不同的模式,或者您发现失败的迁移不是您认为导致失败的迁移。有趣。可能是适配器中的错误。无论如何,谢谢你录下这个决议。这可能会帮助其他有同样问题的人。
t.references:author,referee