Rails当你运行一个数据库回滚错误:ActiveRecord::IrreversibleMigration exception
最近rails3.2在更改数据库表字段,然后要回滚取消,但在运行rake db:rollback命令,错误:
rake aborted!
An error has occurred, all later migrations canceled:
ActiveRecord::IrreversibleMigration/usr/local/rvm/gems/ruby-1.9.3-p392/gems/activerecord-3.2.14/lib/active_record/migration/command_recorder.rb:42:in `block in inverse'
我的migration内容例如以下:
class ChangeVmTempColumns < ActiveRecord::Migration
def change
change_table :vm_temps do |t|
t.change :disksize, :integer, :limit => 8
t.change :mem_total, :integer, :limit => 8
end
end
end
上网查了资料,貌似原因在于假设在migration中做的数据类型转换是破坏性的时,就不能完毕回滚。
也就是说,对数据库表的字段类型进行改动时。数据库中的数据也会有变化,这样不能回滚这些变动的数据。
《The migration that cannot be undone: Irreversible Migration》文章中举了一个样例:当我们在migration中change_column由integer变为string时是能够的,可是假设反过来。字段类型由string变为integer,我们就不能reverse
this migration。正好和我这样的情况一致!
Stackoverflow上,这个问题《ActiveRecord::IrreversibleMigration exception
when reverting migration》提供了一个解决的方法:把self.change改为self.up和self.down方法。
改动后的migration:
class ChangeVmTempColumns < ActiveRecord::Migration
def self.up
change_table :vm_temps do |t|
t.change :disksize, :integer, :limit => 8
t.change :mem_total, :integer, :limit => 8
end
end def self.up
change_table :vm_temps do |t|
t.change :disksize, :string
t.change :mem_total, :string
end
end
end
运行rake db:rollback,成功!
原因:我原来觉得在Rails中,self.change方法直接把self.up和self.down两个综合在一起,运行和回滚仅仅用一个change方法就能够,可是经过这个样例,我觉得self.change方法运行回滚时。仅仅能採用默认的方式运行,一旦出现上述类型转换的问题就无法正常运行。可是self.down方法运行回滚时。会强制运行self.down声明,所以没有irreversible migration错误。
版权声明:本文博客原创文章,博客,未经同意,不得转载。
Rails当你运行一个数据库回滚错误:ActiveRecord::IrreversibleMigration exception的更多相关文章
- 数据库回滚(rollback)和撤销(undo)的区别
数据库回滚(rollback)和撤销(undo)的区别就是把某一个数据库操作恢复到该操作之前的状态,下面结合自己理解总结一下区别,如有错误,欢迎各路大佬斧正: 数据库事务过程:执行SQL——提交 ...
- 浅析Mysql 数据回滚错误的解决方法
介绍一下关于Mysql数据回滚错误的解决方法.需要的朋友可以过来参考下 MYSQL的事务处理主要有两种方法.1.用begin,rollback,commit来实现begin 开始一个事务rollbac ...
- 浅析Mysql数据回滚错误的解决方法
介绍一下关于Mysql数据回滚错误的解决方法.需要的朋友可以过来参考下 MYSQL的事务处理主要有两种方法. 1.用begin,rollback,commit来实现 begin 开始一个事 ...
- mysql事务管理及spring声明式事务中主动异常抛出使数据库回滚
mysql的引擎常用的有两个,一个MyISAM,另一个是InnoDB,mysql默认的为MyISAM,而InnoDB才是支持事务的.所以一般需要修改下,如何修改就不说了. 事务需要依赖数据库,好久没使 ...
- Spring事务只对运行时异常回滚
我们在使用Spring时候一般都知道事务在遇到异常的时候会回滚,岂不知Spring的事务默认只有在发生运行时异常即:RunTimeException时才会发生事务,如果一个方法抛出Exception或 ...
- mysql数据库回滚
在应用$mysqli时,因没常用到数据回滚,老忘,整理下,做个记录. $mysqli->autocommit(FALSE);//自动提交设置关闭 $mysqli->query(" ...
- oracle数据库回滚
线下测试数据误操作,回滚攻略--把数据捞出来,这个时间自己设置--表名一定要是:xx_tbd日期 CREATE TABLE user_tbd0718ASselect * from user as of ...
- git回滚错误提交
git log //找到你要回滚的那次提交 比如:43596f6b1f57157e627c25ae7a843f60157ac52d git reset --hard HEAD~43596f6b1f57 ...
- Oracle 数据库 回滚
1.打开Flash存储的权限ALTER TABLE authorization ENABLE row movement ;2.把表还原到指定时间点flashback table authorizati ...
随机推荐
- adp设备是什么
今天在写软工文档的可行性分析部分的时候.遇到一个新名词--adp,瞬间就不淡定了.原话例如以下: 6.1.1 基本建设投资 包含採购.开发和安装下列各项所需的费用,如: a. 须要提供一件教室,供开发 ...
- Android开发系列(十九个):至SimpleAdapter设置样式
Adapter任务:在数据adapter处理后做.展会上的观点 对于一般ArrayAdapter供.传递给ArrayAdapter之后就能够在视图上用一个列表显示出这个字符串数组. 比例如以下边的代码 ...
- JDK的dt.jar和Java BeanInfo接口
在JAVA_HOME/lib以下有两个比較重要的jar文件.tools.jar和dt.jar. tools.jar在上篇文章中做了简单的介绍.这里来介绍下dt.jar. 在Oracle官方站点搜dt. ...
- oracle数据库全然恢复和不全然恢复以及运行用户管理辈分恢复
比較全然恢复和不全然恢复: 一.全然恢复:将数据库恢复到当前最新状态,包含直至请求恢复时进行的全部已提交的数据更改 二.不全然恢复:将数据库恢复到请求恢复操作之前指定的过去时间点 一.全然恢复过程 以 ...
- 于Eclipse在建筑cocos2d-x的Android开发环境(避免cygwin)
于Eclipse在建筑cocos2d-x的Android开发环境(避免cygwin) 在袭击几天学习Android开发之后,我開始转向cocos2d-x的Android开发了.因为自己曾经有了解过co ...
- hightmaps 按地图上显示的统计数据
离extjs 至 easyui 到html5到hightchars 再到hightmaps.Exjts和easyui很相似,extjs是重量级的,easyui轻量级的.比extjs容易上手.照着dem ...
- .Net常用方法汇总
//创建某个目录的文件夹 调用如下: var folder = initFolder(Export_Folder.Text, "ExportMembers"); private s ...
- C++ Primer 学习笔记_54_类和数据抽象 --拷贝构造函数、赋值运算符
拷贝控制 --复制构造函数.赋值操作符 引言: 当定义一个新类型时,须要显式或隐式地指定复制.赋值和撤销该类型的对象时会发生什么– 复制构造函数.赋值操作符和析构函数的作用! 复制构造函数: ...
- crawler_大型舆情架构图
- Moq 和RhinoMocks
Moq & RhinoMocks 使用Mock对象进行测试一般都会有以下三个关键步骤: 使用接口来描述需要测试的对象 为实际的产品代码实现这个接口 以测试为目的,在Mock对象中实现这个接口 ...