SORU
26 Mart 2009, PERŞEMBE


Rolling başarısız raylar geçiş geri

Nasıl geri başarısız raylar geçiş roll musunuz? Bu komisyon db beklerdim:geri alma işlemi başarısız geçiş bozacak, ama hayır, geri önceki göç alır (başarısız göç eksi bir). Ve rake db:göç:aşağı VERSİON=myfailedmigration da çalışmıyor. Bu birkaç kez yaptım ve çok sinir bozucu. İşte sorun çoğaltmak 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: migrating =====================================================
-- add_column(:assets, :test, :integer)
   -> 0.0932s
-- add_column(:asset, :error)
rake aborted!
An error has occurred, all later migrations canceled:

wrong number of arguments (2 for 3)

Tamam, geri sağlar

$ rake db:rollback
==  AddLevelsToRoles: reverting ===============================================
-- remove_column(:roles, :level)
   -> 0.0778s
==  AddLevelsToRoles: reverted (0.0779s) ======================================

değil mi? bu SimpleTest, başarısız geçişten önce son geçiş oldu. (Ve oh, geçiş çıkış olsa daha iyi olurdu sürüm numarası. dahil)

Yani aşağı başarısız geçiş SimpleTest için çalıştırmayı deneyin sağlar:

$ rake db:migrate:down VERSION=20090326173033
$

Hiçbir şey olmuyor, ve ya çıktı. Ama belki de göç neyse koştu? Yani SimpleTest geçiş sözdizimi hatası düzeltme sağlar, ve tekrar çalıştırmayı deneyin.

$ rake db:migrate:up VERSION=20090326173033
==  SimpleTest: migrating =====================================================
-- add_column(:assets, :test, :integer)
rake aborted!
Mysql::Error: Duplicate column name 'test': ALTER TABLE `assets` ADD `test` int(11)

Hayır. Belli ki göç:aşağı işe yaramadı. Başarısız değil, sadece yürütme değil.

Hiçbir şekilde tabloya el ile veritabanına gidiyor ve kaldırılması dışında yinelenen ve sonra test kurtulmak için. Bundan daha iyi bir yolu olmalı.

CEVAP
26 Mart 2009, PERŞEMBE


Ne yazık ki, elle MySQL için başarısız oldu göçler temizlemek gerekir. MySQL veritabanı işlemsel tanım değişiklikleri desteklemez.

Raylar 2.2 PostgreSQL için işlem geçişleri içerir. Raylar 2.3 SQLite için işlem geçişleri içerir.

Bu pek yardımcı sizin için sorun şu anda, ama eğer bir seçim veritabanı gelecekteki projeleri, öneririm kullanarak bir destek olması için işlem DDL çünkü yapar göçler çok daha keyifli.

Güncelleme - bu hala bir cevap burada Raylar 4.2.1 ve 5.7, Alejandro Babio tarafından bildirilen MySQL 2015, doğrudur.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Microsoft Research

    Microsoft Re

    24 EKİM 2008
  • o0oCyrusViruso0o

    o0oCyrusViru

    11 Mart 2008
  • RickardRick

    RickardRick

    9 Mart 2007