Ruby on rails 不可逆迁移,可以修复吗?-轨道4

Ruby on rails 不可逆迁移,可以修复吗?-轨道4,ruby-on-rails,ruby,heroku,Ruby On Rails,Ruby,Heroku,所以我做了这样的迁移 class AddDatetimeAttrToUsers < ActiveRecord::Migration def change change_column :users, :oauth_expires_at, :datetime end end 当我搜索它时,我创建了这样一个新的迁移,作为使用change更改属性的最佳实践 class PutDatetimeFieldToUsersExpireAtColumn < ActiveRecord:

所以我做了这样的迁移

class AddDatetimeAttrToUsers < ActiveRecord::Migration
  def change
    change_column :users, :oauth_expires_at, :datetime
  end
end
当我搜索它时,我创建了这样一个新的迁移,作为使用change更改属性的最佳实践

class PutDatetimeFieldToUsersExpireAtColumn < ActiveRecord::Migration
  def change
    remove_column :users, :oauth_expires_at
    add_column :users, :oauth_expires_at, :datetime
  end
end
class PutDateTimeFieldTouserExpireAtColumn
因此,我尝试使用rake db:rollback删除最后一次迁移,并添加此迁移,通知我最后一次迁移是不可逆的


我的问题是,有没有一种方法可以在不可逆迁移上实际回滚,还是应该使用上面的新迁移进行迁移?

似乎需要在列处指定当前类型的oauth\u expires\u,因为在回滚时Rails应该知道它可以创建列。我的意思是:

remove_column :users, :oauth_expires_at, :string

如果您胆敢丢失本地数据库中的数据,则可以通过执行以下步骤从不可逆迁移中恢复(通过丢失数据库数据):

1-首先删除您的数据库(假设您在开发环境中,并且可以在该环境中删除数据库-您的测试数据库也将消失)

2-重新加载架构文件:

rake db:schema:load
3-要查看当前迁移文件,请执行以下操作:

rake db:migrate:status
4-删除要删除的迁移:

rake db:migrate:down VERSION=xxxxxx


rails destroy migration migration_name
5-然后您可以使用db:migrate来迁移迁移

rake db:migrate

您可以在迁移中定义
up
down
方法,而不是
change
。 以下是一个例子:

def up
  connection.execute %(create or replace view name_of_the_db_view)
end

def down
  connection.execute %(drop view name_of_the_db_view)
end

使用它,您将能够
迁移
回滚以前不可逆的迁移,就像正常迁移一样。

在您的示例中,您有以下迁移文件:

class AddDatetimeAttrToUsers < ActiveRecord::Migration
  def change
    change_column :users, :oauth_expires_at, :datetime
  end
end
class AddDatetimeAttrToUsers < ActiveRecord::Migration
      def up
        change_column :users, :oauth_expires_at, :datetime
      end
      def down
        change_column :users, :oauth_expires_at, :time (or whatever type existed before datetime)
      end
    end
现在,您可以运行
rake db:rollback
并避免不可逆的迁移错误,但前提是您没有添加其他迁移。如果添加了其他迁移,则需要使用
rake db:down VERSION=2018xxxxxxx
rake db:rollback STEP=X
指定返回的距离

现在编辑迁移,使其与pg和sqlite3配合使用:

class AddDatetimeAttrToUsers < ActiveRecord::Migration
          def up
            change_column :users, :oauth_expires_at, :datetime, using: 'oauth_expires_at::datetime'
          end
          def down
            change_column :users, :oauth_expires_at, :time

        end
class AddDateTimeAttrtUsers
现在,您应该能够rake db:migrate,推送到heroku,heroku运行rake db:migrate并继续


最后,您应该让pg在本地工作以匹配您的生产环境。

不可逆迁移是不可逆的,因为您会破坏数据。您可能感兴趣的是,它让您知道如何在迁移中使用
(如提示所示)。(编辑:将链接更改为更好的链接)如何添加USING子句?
class AddDatetimeAttrToUsers < ActiveRecord::Migration
      def up
        change_column :users, :oauth_expires_at, :datetime
      end
      def down
        change_column :users, :oauth_expires_at, :time (or whatever type existed before datetime)
      end
    end
class AddDatetimeAttrToUsers < ActiveRecord::Migration
          def up
            change_column :users, :oauth_expires_at, :datetime, using: 'oauth_expires_at::datetime'
          end
          def down
            change_column :users, :oauth_expires_at, :time

        end