R.Reddington

WFN Üye
Konular
522
Mesajlar
522
Çözüm
0
Ticaret Puanı
0
Üyelik
24 Gün
Konum
Kastamonu
Web Sitesi
Var
Alanı
Sosyal Backlink
1/1
Konu sahibi
İlk migration’ı geri almak için Rails uygulamasının kök dizininde bin/rails db:rollback komutunu çalıştırın. Bu komut, veritabanında en son uygulanmış migration’ın geri alma işlemini yürütür. Birden fazla migration’ı geri almak için STEP değeri verilir; belirli bir migration’ı hedeflemek için sürüm numarasıyla db:migrate:down kullanılır. Komutun sonunda görülen durum listesini ve veritabanı şemasını kontrol etmeden işlemin tamamlandığını varsaymayın.

En son migration’ı geri alma​


Migration dosyalarınızı değiştirmeden önce uygulamanın kök dizinine geçin. Rails’in hangi migration’ları uyguladığını görmek için önce şu komutu çalıştırabilirsiniz:

Bash:
bin/rails db:migrate:status

Çıktıda up olarak görünen migration’lar veritabanına uygulanmış, down olarak görünenler ise henüz uygulanmamış migration’lardır. En son uygulanmış migration’ın satırını belirledikten sonra geri alma işlemini başlatın:

Bash:
bin/rails db:rollback

Rails, en son uygulanmış migration’ın geri alma yönündeki işlemini çalıştırır ve migration durumunu down olarak değiştirir. Örneğin son migration bir tablo oluşturduysa tablo kaldırılabilir; bir sütun eklediyse sütun silinebilir. Ancak bu sonuç migration’ın geri alma işleminin tanımlanabilir olmasına bağlıdır.

İşlemden sonra durumu yeniden kontrol edin:

Bash:
bin/rails db:migrate:status

İlgili migration’ın down olduğunu görmeniz, yalnızca migration’ın artık uygulanmış kabul edilmediğini gösterir. Beklenen tablo veya sütunun gerçekten veritabanında bulunmadığını ayrıca kontrol edin. Özellikle özel SQL, veri taşıma işlemleri veya veritabanına özgü komutlar kullanıldıysa migration durumu ile gerçek şema arasında uyuşmazlık oluşabilir.

Birden fazla migration’ı geri almak​


Son uygulanan birden fazla migration’ı sırayla geri almak için STEP kullanın:

Bash:
bin/rails db:rollback STEP=3

Bu komut, son üç uygulanmış migration için geri alma işlemini çalıştırır. Rails migration’ları en yeniden eskiye doğru geri alır; bu sıra önemlidir çünkü sonraki migration’lar önceki tablo veya sütunlara bağlı olabilir.

Örneğin son migration’lar aşağıdaki sırayla uygulanmışsa:
  • Kullanıcılara time_zone sütunu eklendi.
  • Siparişler için yeni bir tablo oluşturuldu.
  • Kullanıcılara phone_number sütunu eklendi.
STEP=3 kullanıldığında önce telefon sütununu ekleyen migration, sonra siparişler tablosunu oluşturan migration, ardından saat dilimi sütununu ekleyen migration geri alınır. Bu işlemin sonucunda yalnızca son migration’ın değil, belirtilen sayıdaki son migration’ın etkisi kaldırılır.

Belirli bir migration’ı geri alma​


Migration listesinden hedef sürüm numarasını alın:

Bash:
bin/rails db:migrate:status

Örnek bir dosya adı 20261025094500_add_phone_number_to_users.rb ise migration sürümü 20261025094500 bölümüdür. Bu migration’ı aşağıdaki komutla geri alabilirsiniz:

Bash:
bin/rails db:migrate:down VERSION=20261025094500

Bu komut özellikle aradaki belirli bir migration’ı hedeflemek istediğinizde kullanışlıdır. Fakat aradaki bir migration’ı geri almak, kendisinden sonra uygulanan migration’ların hâlâ çalışıyor olması nedeniyle tutarsız bir şema oluşturabilir. Örneğin ikinci migration’ın eklediği sütun üçüncü migration tarafından kullanılıyorsa yalnızca ikinci migration’ı geri almak sonraki kodu veya migration’ları bozabilir.

Bu nedenle çoğu durumda daha güvenli sıra şudur:
  1. Hedef migration’ın sürümünü db:migrate:status ile belirleyin.
  2. Bu migration’dan sonra uygulanmış migration’ları da listeleyin.
  3. Gerekliyse önce sonraki migration’ları db:rollback veya uygun STEP değeriyle geri alın.
  4. Ardından hedef migration’ı db:migrate:down VERSION=... ile geri alın.
  5. Şema ve migration durumunu yeniden kontrol edin.

Migration’ı geri alıp yeniden çalıştırma​


Son migration’da düzenleme yaptıktan sonra onu geri alıp yeniden çalıştırmak için db:migrate:redo kullanılabilir:

Bash:
bin/rails db:migrate:redo

Belirli sayıda son migration için:

Bash:
bin/rails db:migrate:redo STEP=2

Bu işlem önce belirtilen migration’ları geri alır, ardından yeniden uygular. Migration dosyasını değiştirmek, daha önce uygulanmış migration’ı otomatik olarak yeniden çalıştırmaz. Dosyayı düzenledikten sonra değişikliğin veritabanına yansıması için migration’ın gerçekten geri alınması ve yeniden uygulanması gerekir.

Ancak migration üretim veritabanında daha önce çalıştırılmışsa eski dosyayı değiştirmek yerine yeni bir migration oluşturmak genellikle daha güvenlidir. Çünkü eski migration’ın değiştirilmesi, farklı ortamlarda aynı migration geçmişinin farklı sonuçlar üretmesine yol açabilir.

Migration neden geri alınamayabilir?​


Bir migration change yöntemiyle yazılmışsa Rails bazı işlemlerin tersini kendisi çıkarabilir. Örneğin tablo oluşturma, sütun ekleme veya indeks ekleme gibi standart işlemler çoğu durumda otomatik olarak geri çevrilebilir.

Buna karşılık Rails ters işlemi belirleyemediğinde migration geri alınamaz. Örneğin aşağıdaki gibi geri dönüşü tanımlanmamış bir işlem kullanılabilir:

Ruby:
class UpdateUserNames < ActiveRecord::Migration[7.0]
  def up
    execute "UPDATE users SET name = TRIM(name)"
  end

  def down
    raise ActiveRecord::IrreversibleMigration
  end
end

Bu durumda db:rollback komutu, migration’ın geri alınamaz olduğunu belirten hata verir. Hata, veritabanının otomatik olarak güvenli bir önceki hâle getirildiğini kanıtlamaz; komutun hangi aşamada durduğunu ve veritabanında kısmi değişiklik olup olmadığını ayrıca kontrol etmeniz gerekir.

Geri alma işlemi gerçekten tanımlanabiliyorsa up ve down yöntemlerini ayrı yazın veya reversible bloğu kullanın. down yöntemi, up yönteminin yaptığı işlemi tersine çevirecek şekilde tasarlanmalıdır. Veri silen veya veriyi dönüştüren işlemlerde yalnız şema değişikliğini değil, kaybolabilecek verinin nasıl korunacağını da planlayın.

Komut seçimi ve sonucu​


Aşağıdaki ayrım, yanlış migration’ı geri alma riskini azaltır.
İhtiyaçKomutBeklenen sonuç
Son migration’ı geri almakbin/rails db:rollbackSon uygulanmış migration geri alınır.
Son birkaç migration’ı geri almakbin/rails db:rollback STEP=3Son üç migration ters sırayla geri alınır.
Belirli sürümü geri almakbin/rails db:migrate:down VERSION=...Belirtilen sürümün down işlemi çalıştırılır.
Geri alıp yeniden uygulamakbin/rails db:migrate:redoMigration geri alınır ve yeniden çalıştırılır.
Migration geçmişini görmekbin/rails db:migrate:statusMigration’ların up veya down durumu gösterilir.
Komutun başarılı görünmesi, uygulamanın beklenen davranışa döndüğünü tek başına kanıtlamaz. Geri alınan değişiklik bir tablo, sütun, indeks veya kısıtsa veritabanında bunu doğrulayın; uygulamanın ilgili testlerini ya da en azından migration’ın etkilediği işlemleri çalıştırın. Üretim ortamında işlem yapıyorsanız önce yedek, etkilenecek tablo ve veri kaybı ihtimalini değerlendirin. Geri alma veri siliyorsa komutun tersini çalıştırmak silinen veriyi kendiliğinden geri getirmez.

Üretim ortamında dikkat edilmesi gerekenler​


Geliştirme ortamında db:rollback çalıştırmakla üretim veritabanında aynı komutu çalıştırmak aynı risk düzeyinde değildir. Önce doğru ortam değişkenleriyle hangi veritabanına bağlandığınızı ve migration durumunu kontrol edin. Ardından geri alınacak migration’ın hangi tablo veya sütunları etkilediğini inceleyin.

Üretimde yanlış migration’ı geri aldıysanız, rastgele yeni rollback komutları çalıştırmak yerine şu bilgileri birlikte değerlendirin: migration sürümü, db:migrate:status çıktısı, komutun tam hata mesajı, veritabanı şemasındaki mevcut durum ve varsa yedekleme noktası. Sorun yalnız migration kaydı ile gerçek şemanın farklı olmasıysa kayıt ve şema birbirinden bağımsız düzeltilmelidir; yalnızca migration tablosundaki durumu değiştirmek eksik tablo veya kaybolan veriyi geri getirmez.

Özetle, son migration için bin/rails db:rollback, birden fazla migration için STEP, belirli bir sürüm için db:migrate:down VERSION=... kullanılır. İşlem sonrasında hem migration durumunu hem de veritabanındaki gerçek değişikliği kontrol edin; geri alınamaz veya veri kaybı içeren migration’larda yeni migration, yedek veya kontrollü veri düzeltme planı olmadan ilerlemeyin.
 

Sende şimdi bize katılmak ister misin?

Kayıt ol

Bize katılım kolay ve ücretsizdir!

Foruma git ?

Bu konuyu görüntüleyen kullanıcılar

Bu konuyu şu anda görüntüleyen üye bulunmuyor.
Robotlar:
  • Anthropic