日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

Rails当你运行一个数据库回滚错误:ActiveRecord::IrreversibleMigration exception

發(fā)布時(shí)間:2024/1/17 数据库 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Rails当你运行一个数据库回滚错误:ActiveRecord::IrreversibleMigration exception 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
最近rails3.2在更改數(shù)據(jù)庫(kù)表字段,然后要回滾取消,但在運(yùn)行rake db:rollback命令,錯(cuò)誤:

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內(nèi)容例如以下:

class ChangeVmTempColumns < ActiveRecord::Migrationdef changechange_table :vm_temps do |t|t.change :disksize, :integer, :limit => 8t.change :mem_total, :integer, :limit => 8endend end

上網(wǎng)查了資料,貌似原因在于假設(shè)在migration中做的數(shù)據(jù)類型轉(zhuǎn)換是破壞性的時(shí),就不能完畢回滾。

也就是說(shuō),對(duì)數(shù)據(jù)庫(kù)表的字段類型進(jìn)行改動(dòng)時(shí)。數(shù)據(jù)庫(kù)中的數(shù)據(jù)也會(huì)有變化,這樣不能回滾這些變動(dòng)的數(shù)據(jù)。

《The migration that cannot be undone: Irreversible Migration》文章中舉了一個(gè)樣例:當(dāng)我們?cè)趍igration中change_column由integer變?yōu)閟tring時(shí)是能夠的,可是假設(shè)反過(guò)來(lái)。字段類型由string變?yōu)閕nteger,我們就不能reverse this migration。正好和我這樣的情況一致!

Stackoverflow上,這個(gè)問(wèn)題《ActiveRecord::IrreversibleMigration exception when reverting migration》提供了一個(gè)解決的方法:把self.change改為self.up和self.down方法。

改動(dòng)后的migration:

class ChangeVmTempColumns < ActiveRecord::Migrationdef self.upchange_table :vm_temps do |t|t.change :disksize, :integer, :limit => 8t.change :mem_total, :integer, :limit => 8endenddef self.upchange_table :vm_temps do |t|t.change :disksize, :stringt.change :mem_total, :stringendend end

運(yùn)行rake db:rollback,成功!

原因:我原來(lái)覺得在Rails中,self.change方法直接把self.up和self.down兩個(gè)綜合在一起,運(yùn)行和回滾僅僅用一個(gè)change方法就能夠,可是經(jīng)過(guò)這個(gè)樣例,我覺得self.change方法運(yùn)行回滾時(shí)。僅僅能採(cǎi)用默認(rèn)的方式運(yùn)行,一旦出現(xiàn)上述類型轉(zhuǎn)換的問(wèn)題就無(wú)法正常運(yùn)行。可是self.down方法運(yùn)行回滾時(shí)。會(huì)強(qiáng)制運(yùn)行self.down聲明,所以沒有irreversible migration錯(cuò)誤。

版權(quán)聲明:本文博客原創(chuàng)文章,博客,未經(jīng)同意,不得轉(zhuǎn)載。

總結(jié)

以上是生活随笔為你收集整理的Rails当你运行一个数据库回滚错误:ActiveRecord::IrreversibleMigration exception的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。