使用Capistrano修复rails迁移在服务器而不是git repo上运行

时间:2017-05-15 03:44:24

标签: ruby-on-rails ruby-on-rails-4 capistrano spree rails-migrations

我将Spree Commerce从3.0版升级到3.1版但忘记从我的本地开发环境检查Git上的迁移文件

我改为在服务器上生成迁移文件;我最终将迁移从我的开发环境提交到git,但现在我遇到了各种各样的部署问题,因为它试图在表存在时运行迁移。

我想我真的不需要迁移才能运行,因为它在服务器上?

在服务器上运行rake db:migrate:status显示:

   up     20151015124064  Add meta title to page.spree static content
   up     20151015124065  Add render as partial for layout for spree pages.spree static content
   up     20151015124066  Add pages stores.spree static content
  down    20160707102753  Create spree store credits.spree
  down    20160707102754  Create spree store credit categories.spree
  down    20160707102755  Create spree store credit events.spree
  down    20160707102756  Create spree store credit types.spree
  down    20160707102757  Add missing indexes.spree
  down    20160707102758  Remove duplicated indexes from multi columns.spree
  down    20160707102759  Remove user index from spree state changes.spree
  down    20160707102760  Add position to spree payment methods.spree
  down    20160707102761  Add taxable adjustment total to line item.spree
  down    20160707102762  Migrate payment methods display.spree
  down    20160707102763  Spree payment method store credits.spree
  down    20160707102764  Rename has and belongs to associations to model names.spree
  down    20160707102765  Spree store credit types.spree
  down    20160707102766  Add discontinued to products and variants.spree
  down    20160707102767  Remove shipping method id from spree orders.spree
  down    20160707102768  Add id column to earlier habtm tables.spree
  down    20160707102769  Add indexes.spree
  down    20160707102770  Add missing indices on user.spree auth
  down    20160707102771  Remove show in footer from spree pages.spree static content

在我的位置机器上显示:

   up     20151015124064  Add meta title to page.spree static content
   up     20151015124065  Add render as partial for layout for spree pages.spree static content
   up     20151015124066  Add pages stores.spree static content
   up     20160707102753  Create spree store credits.spree
   up     20160707102754  Create spree store credit categories.spree
   up     20160707102755  Create spree store credit events.spree
   up     20160707102756  Create spree store credit types.spree
   up     20160707102757  Add missing indexes.spree
   up     20160707102758  Remove duplicated indexes from multi columns.spree
   up     20160707102759  Remove user index from spree state changes.spree
   up     20160707102760  Add position to spree payment methods.spree
   up     20160707102761  Add taxable adjustment total to line item.spree
   up     20160707102762  Migrate payment methods display.spree
   up     20160707102763  Spree payment method store credits.spree
   up     20160707102764  Rename has and belongs to associations to model names.spree
   up     20160707102765  Spree store credit types.spree
   up     20160707102766  Add discontinued to products and variants.spree
   up     20160707102767  Remove shipping method id from spree orders.spree
   up     20160707102768  Add id column to earlier habtm tables.spree
   up     20160707102769  Add indexes.spree
   up     20160707102770  Add missing indices on user.spree auth
   up     20160707102771  Remove show in footer from spree pages.spree static content

我认为服务器上的迁移状态应该是up而不是down

有什么提示我应该如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

如果您没有丢失任何数据,可以从sql控制台中删除这些表并重新运行capistrano部署,或者您可以从服务器手动up迁移文件

rake db:migrate:up VERSION=20151015124064

其中version是rake db:migrate:status

结果的第二列
  

注意:请记住,你必须在两个案例中删除这些表

答案 1 :(得分:0)

如果您不想丢失数据并重新执行此操作,则可以尝试另一种方法。

迁移标记为updown,具体取决于迁移版本是否作为schema_migrations表中的记录存在。 因此,解决问题的一种方法是添加包含以下内容的文件app/models/schema_migration.rb

class SchemaMigration < ActiveRecord::Base
  self.primary_key = :version
  attr_accessible :version

  # you can call the method below via console or even call
  # or execute the commands directly from the rails console
  def self.fix_migrations
     # basically a list of all migrations that you run on server but are not marked as up
    down_migrations = %w(20160707102753 20160707102754 ... 20160707102771)
    down_migrations.each do |m|
      # this will add an entry in the schema_migrations datatable
      # on server so rake db:migrate won't try to run these again
      SchemaMigration.create(version: m) 
    end        
  end

end

然后通过rails控制台执行:SchemaMigration.fix_migrations

如果您需要再次运行特定迁移,或者您不小心添加了之前从未执行过的迁移版本,则始终可以使用SchemaMigration.find_by_version('xxxx').delete从schema_migrations中删除该条目。这将允许rake db:migrate再次尝试运行该迁移。