rake db:为“表已存在”迁移ERROR

时间:2014-05-21 22:35:11

标签: ruby-on-rails rake capistrano migrate

我使用capistrano 3.1来部署到prod服务器。

以前,它运作正常。但今天,当我更改一个rb文件(没有添加和更改数据库迁移)时,在部署过程中,当它运行到

Running /usr/local/rvm/bin/rvm default do bundle exec rake db:migrate on xxx

显示错误:

[cc1734f0]  Migrating to CreateDevices (20140416233606)
DEBUG [cc1734f0]    == 20140416233606 CreateDevices: migrating ====================================
DEBUG [cc1734f0]    
DEBUG [cc1734f0]    -- create_table(:devices)
DEBUG [cc1734f0]    
DEBUG [cc1734f0]    Mysql2::Error: Table 'devices' already exists: CREATE TABLE `devices` (`id` int(11) auto_increment PRIMARY KEY, `soh_id` varchar(255), `token_id` varchar(255), `device_hw` varchar(255), `device_sw` varchar(255), `device_name` varchar(255), `created_at` datetime, `updated_at` datetime) ENGINE=InnoDB
 DEBUG [cc1734f0]   rake aborted!

但在我的schema.rb中,我有:

ActiveRecord::Schema.define(version: 20140513035458) do

因为我上次部署已经创建了表,所以现在报告错误。

为什么rake db:migrate会运行迁移,这已经再次执行了!

我不能放弃表格,因为它已包含数据。

2 个答案:

答案 0 :(得分:2)

如果表格尚不存在,请将您的迁移更新为有条件执行

 class MyMigration < ActiveRecord::Migration
   def change
     unless table_exists? :devices
      #create the table
     end
  end
 end

答案 1 :(得分:0)

解决此问题的一种方法是将'20140416233606'添加到schema_migration表中。然后Rails将不会运行此迁移。