修复轨道迁移在服务器上运行,而不是使用 Capistrano 的 git 存储库



我将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

有什么提示我应该如何处理这个问题吗?

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

rake db:migrate:up VERSION=20151015124064

其中版本是rake db:migrate:status结果的第二列

注意:请记住,您必须在这两种情况下都删除这些表

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

根据迁移版本是否作为记录存在于schema_migrations表中,将迁移标记为updown。因此,解决问题的一种方法是添加包含以下内容的文件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尝试再次运行该迁移。

最新更新