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 ...
随机推荐
- C# 获得Excel工作簿Sheet页面(工作表)集合的名称
#region 获取Excel工作薄中Sheet页(工作表)名集合 /// <summary> /// 获取Excel工作薄中Sheet页(工作表)名集合 /// </summary ...
- 開始开发 Dashboard Widgets,第2章,读书笔记
文件夹:http://blog.csdn.net/wide288/article/details/40298693 主要内容: widgets 的组成是什么. 怎么创建 info.plist 文件 怎 ...
- deepinmind(转)
http://it.deepinmind.com/ 花名有孚,支付宝工程师 有希望加入支付宝的同学,可以把简历发到我的个人邮箱spidercoco@gmail.com
- linux(fedora) 下dvwa 建筑环境
linux(fedora)下dvwa组态 1.下载httpd,dvwa,mysql,mysqlserver, php-mysql,php 除了dvwa 这是外界进入下一官方网站.该服务通过休息inst ...
- 3 sum
3-sum 标题叙述性说明: Given an array S of n integers, are there elements a, b, c in S such that a + b + c = ...
- 高速建成Android开发环境ADT-Bundle和Hello World
----下载JDK(Java Dev Kit) 官方下载:http://www.oracle.com/technetwork/java/javase/downloads/index.html 兴许步骤 ...
- 如何为ios酷我音乐盒下载导出的音乐文件(使用Java程序设计)
这个工具已经准备第二版,读者了解编程软件,可以直接使用,请阅读和使用这个场地 http://blog.csdn.net/jzj1993/article/details/44459983 本文所涉及内容 ...
- Android APK反编译就这么简单 详细解释(简介)
学习Android开发过程,你会向别人学习如何应用软件的开发,那些漂亮的动画和复杂的布局可能让你爱不释手,作为开发者.你可能真的想知道的是如何实现的界面效果.然后.您将能够更改应用程序APK反编译查看 ...
- 多校训练赛2 ZCC loves cards
ZCC loves cards Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- 【Leetcode】Sort List (Sorting)
这个问题需要与归并排序排两个名单,基本思路分为切割与合并 合并后的代码Merge Two Sorted List里已经讲得非常清楚了. 所以这里直接给出代码. public ListNode merg ...