Başarısız bir ray geçişini nasıl geri alırsınız? Bunun rake db:rollback
başarısız geçişi geri almasını beklerdim , ancak hayır, önceki geçişi geri alır (başarısız geçiş eksi bir). Ve rake db:migrate:down VERSION=myfailedmigration
çalışmıyor da. Bununla birkaç kez karşılaştım ve bu çok sinir bozucu. İşte sorunu tekrarlamak için yaptığım basit bir test:
class SimpleTest < ActiveRecord::Migration
def self.up
add_column :assets, :test, :integer
# the following syntax error will cause the migration to fail
add_column :asset, :test2, :integer
end
def self.down
remove_column :assets, :test
remove_column :assets, :test2
end
end
sonuç:
== SimpleTest: geçiş =============================================== ======== - add_column (: varlıklar,: test,: tamsayı) -> 0,0932 - add_column (: varlık,: hata) tırmık iptal edildi! Bir hata oluştu, sonraki tüm geçişler iptal edildi: yanlış sayıda bağımsız değişken (3 için 2)
tamam, geri alalım:
$ rake db: geri alma == AddLevelsToRoles: ters çevirme ============================================= == - remove_column (: roller,: düzey) -> 0,0778 sn == AddLevelsToRoles: geri çevrildi (0.0779s) ======================================
ha? bu, başarısız geçiş değil, SimpleTest'ten önceki son geçişimdi. (Ve ah, taşıma çıktısının sürüm numarasını içermesi güzel olurdu.)
Öyleyse, başarısız geçiş SimpleTest'i aşağı çalıştırmayı deneyelim:
$ rake db: geçiş: aşağı VERSION = 20090326173033 $
Hiçbir şey olmuyor ve çıktı da yok. Ama belki yine de göçü yönetti? Öyleyse SimpleTest geçişinde sözdizimi hatasını düzeltelim ve tekrar çalıştırmayı deneyelim.
$ rake db: geçiş: yukarı VERSION = 20090326173033 == SimpleTest: geçiş =============================================== ======== - add_column (: varlıklar,: test,: tamsayı) tırmık iptal edildi! Mysql :: Hata: Yinelenen sütun adı 'test': ALTER TABLE `assets` ADD` test` int (11)
Hayır! Açıkçası göç: aşağı işe yaramadı. Başarısız değil, sadece icra etmiyor.
Bu yinelenen tablodan kurtulmanın, veritabanına manuel olarak girip onu kaldırıp ardından testi çalıştırmaktan başka yolu yoktur. Bundan daha iyi bir yolu olmalı.