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