Rails当你运行一个数据库回滚错误:ActiveRecord::IrreversibleMigration exception
我的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)題。
- 上一篇: Sql语句之select 5种查询
- 下一篇: 对正在运行的mysql进行监控