我使用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会运行迁移,这已经再次执行了!
我不能放弃表格,因为它已包含数据。
答案 0 :(得分:2)
如果表格尚不存在,请将您的迁移更新为有条件执行
class MyMigration < ActiveRecord::Migration
def change
unless table_exists? :devices
#create the table
end
end
end
答案 1 :(得分:0)
解决此问题的一种方法是将'20140416233606'添加到schema_migration表中。然后Rails将不会运行此迁移。