【问题标题】:Mysql2::Error: Table already existsMysql2::Error: 表已经存在
【发布时间】:2016-03-09 16:08:57
【问题描述】:

我有一些需要运行的迁移。但是当我rake db:migrate时出现以下错误。

Mysql2::Error: Table already exists

由于表已经存在,但 schema_migrations 表似乎与应用程序不同步,这种情况会发生 4-5 次。

我的数据库中有一个生产转储,我不想删除表并丢失数据。我目前正在做的是修改schema_migrations 表并在其中手动添加这些冲突的迁移编号,然后再次运行rake db:migrate,直到错误消失,然后我的新迁移开始运行。但这似乎不对。

除了我提到的不涉及删除数据库或丢失数据的解决方案之外,还有其他可行的解决方案吗?

【问题讨论】:

    标签: mysql ruby-on-rails


    【解决方案1】:

    对于此类迁移,您可以在使用迁移中创建表之前检查table_exists

    class Migrationclassname < ActiveRecord::Migration
      def up
        if table_exists?(:table_name)
          # Some changed if required
        else
          # create table 
        end
      end
    
      def down   
      end
    end
    

    【讨论】:

      【解决方案2】:

      这种情况发生了 4-5 次,因为表已经存在,但 schema_migrations 表似乎与应用程序不同步。

      您可以运行rake db:schema:dump 以使您的数据库采用您的架构文件所说的形式。如果架构文件中没有显示上述表,那么您当然可以通过运行rake db:migrate 来创建它们。

      【讨论】:

      • 我认为这不能解决问题。数据库已经与模式文件同步。 schema_migrations 表不是。架构文件远在未来(因此是数据库),但 schema_migrations 表并未反映这一点。
      猜你喜欢
      • 1970-01-01
      • 2014-09-19
      • 2014-11-02
      • 1970-01-01
      • 1970-01-01
      • 2014-07-10
      • 1970-01-01
      • 2015-05-23
      • 2018-09-22
      相关资源
      最近更新 更多