- Konu sahibi
- #1
İlk migration’ı geri almak için Rails uygulamasının kök dizininde
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:
Çıktıda
Rails, en son uygulanmış migration’ın geri alma yönündeki işlemini çalıştırır ve migration durumunu
İşlemden sonra durumu yeniden kontrol edin:
İlgili migration’ın
Son uygulanan birden fazla migration’ı sırayla geri almak için
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:
Migration listesinden hedef sürüm numarasını alın:
Örnek bir dosya adı
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:
Son migration’da düzenleme yaptıktan sonra onu geri alıp yeniden çalıştırmak için
Belirli sayıda son migration için:
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.
Bir migration
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:
Bu durumda
Geri alma işlemi gerçekten tanımlanabiliyorsa
Aşağıdaki ayrım, yanlış migration’ı geri alma riskini azaltır.
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.
Geliştirme ortamında
Üretimde yanlış migration’ı geri aldıysanız, rastgele yeni rollback komutları çalıştırmak yerine şu bilgileri birlikte değerlendirin: migration sürümü,
Özetle, son migration için
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_zonesütunu eklendi. - Siparişler için yeni bir tablo oluşturuldu.
- Kullanıcılara
phone_numbersü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:
- Hedef migration’ın sürümünü
db:migrate:statusile belirleyin. - Bu migration’dan sonra uygulanmış migration’ları da listeleyin.
- Gerekliyse önce sonraki migration’ları
db:rollbackveya uygunSTEPdeğeriyle geri alın. - Ardından hedef migration’ı
db:migrate:down VERSION=...ile geri alın. - Ş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ç | Komut | Beklenen sonuç |
|---|---|---|
| Son migration’ı geri almak | bin/rails db:rollback | Son uygulanmış migration geri alınır. |
| Son birkaç migration’ı geri almak | bin/rails db:rollback STEP=3 | Son üç migration ters sırayla geri alınır. |
| Belirli sürümü geri almak | bin/rails db:migrate:down VERSION=... | Belirtilen sürümün down işlemi çalıştırılır. |
| Geri alıp yeniden uygulamak | bin/rails db:migrate:redo | Migration geri alınır ve yeniden çalıştırılır. |
| Migration geçmişini görmek | bin/rails db:migrate:status | Migration’ların up veya down durumu gösterilir. |
Ü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.