Rails 3'te geçiş dosyaları nasıl silinir


109

Bir taşıma dosyasını kaldırmak / silmek istiyorum. Bunu nasıl yapacağım? Burada benzer sorular olduğunu biliyorum ama güncelleme olarak komut dosyası / yok etmekten daha iyi bir yol var mı?

Ayrıca, bir yapmalıyım db:resetyoksa db:dropben kaldırırsanız / Taşımayı silmek?

Yanıtlar:


142

Ben genelde:

  1. rake db:migrate VERSION=XXXSilmek istediğimden önceki sürüme tüm ortamlarda bir gerçekleştirin .
  2. Taşıma dosyasını manuel olarak silin.
  3. Bekleyen taşımalar varsa (yani, kaldırdığım taşıma sonuncusu değilse), yalnızca yeni bir tane gerçekleştiririm rake db:migrate.

Uygulamanız zaten üretim veya aşamalandırma aşamasındaysa, tablonuzu veya sütunlarınızı yok eden başka bir geçiş yazmak daha güvenlidir.

Geçişler için bir başka harika referans: http://guides.rubyonrails.org/migrations.html


2
Taşıma işlemini silmek ve ardından bir db: migrate çalıştırmak, oluşturulan tabloyu siler mi?
alvincrespo

2
Hayır, çünkü Rails onu nasıl sileceğini bilemeyecektir. self.downVeritabanınızı "eski sürüme geçirmek" için taşıma işleminizde tanımlanan yöntemi çağırması gerekir .
Fábio Batista

35
Dosyayı zaten sildiyseniz, rayların bu kadar kolay gitmesine izin vermeyeceğini fark etmeden rake db:migrate:status, size onu yeniden oluşturmak için kullanabileceğiniz eksik dosyanın kimliğini gösterecektir. Geri döndüğünde, bu cevabın tavsiyesini zafer için takip edebilirsiniz.
Jordan Feldstein

1
@JordanFeldstein, teşekkür ederim. db:migrate:statusbir hayat kurtarıcıdır!
dee

1
@Lucas, taşıma dosyası kaldırıldıktan sonra artık geri alınamaz. Bu nedenle, dosyasını silmeden önce çalıştırdığı tüm ortamlarda (üretim, geliştirme, test, hazırlık vb.) Geri döndürmeniz gerekir. Bu yüzden, zaten üretime geçtikten sonra, eskisini geri almak için başka bir geçiş oluşturmanın daha güvenli olduğunu yazdım.
Fábio Batista

68

Taşımayı silmenin başka bir yolu:

$ rails d migration SameMigrationNameAsUsedToGenerate

Yürütülmeden önce kullanın rake db:migrateçünkü veritabanındaki değişiklikler sonsuza kadar kalacaktır :) - veya değişiklikleri elle kaldırın


3
"Uygulamanız hâlihazırda üretim veya hazırlık aşamasındaysa, tablonuzu veya sütunlarınızı yok eden başka bir geçiş yazmak daha güvenlidir." Yani değişiklikler sonsuza kadar veritabanında
kalmaz

8
Bu arada, "d" "yok et" anlamına geliyor.
Greg M. Krsak

21

Uygulamanın ana dizininden aşağıdaki komutları çalıştırın:

  1. rake db:migrate:down VERSION="20140311142212" (buradaki sürüm, geçiş oluşturulduğunda başına rayların eklediği zaman damgasıdır. Bu işlem, bu geçiş nedeniyle DB değişikliklerini geri alacaktır)

  2. Run "rails destroy migration migration_name"(migration_name, taşıma oluştururken seçtiğiniz tek kullanımdır. Almak için taşıma dosyası adınızdan " timestamp_ " öğesini kaldırın )


rake geçişi yok et AddFileToTable rake iptal edildi! 'Yok Et' görevini nasıl oluşturacağınızı bilmiyorum (Görevi --trace ile çalıştırarak tam izlemeye bakın)
sadaf2605

3
# 2 için doğru komut:rails d migration migration_name
mauriciomdea

1
"Zaman damgasını kaldır" ipucu için teşekkürler ihtiyacım olan buydu
LightMan

10

Ayrıca aşağıdaki gibi aşağı geçişi de çalıştırabilirsiniz:

rake db:migrate:down VERSION=versionnumber

Daha fazla bilgi için geçişlerle ilgili Ruby on Rails kılavuzuna bakın .


9

Kullanabiliriz,

$ rails d migration table_name  

Hangi geçişi siler.


1
Bunun tablo_adı yerine model adı olması gerektiğini düşünüyorum
Ajeet Khan

3

Bazen kendimi geçiş dosyasını silerken ve ardından veritabanından schema_migrations tablosundaki ilgili girişi silerken buldum. Hoş değil ama işe yarıyor.


3

Bu aynı zamanda Rails 5'te de çalışır.

Taşıma en yeniyse, şunları yaparak taşıma işleminin eklediği veritabanı sütunlarını kaldırabilirsiniz:

rake db:rollback

ardından şunu çalıştırarak taşıma dosyasını kaldırın:

rails d migration WhateverYourMigrationWasNamed.rb 


1

Bu yanıtların hiçbiri, silmek istediğim geçiş eksik olduğu için karşılaştığım soruna tam olarak uymuyordu: Başka bir dalda bir geçiş oluşturup çalıştırdım, bu daha sonra atıldı. Sorun, bir geçiş çalıştırıldığında, rails'in sürümü schema_migrationsveritabanındaki bir tabloya eklemesidir. Dolayısıyla, db yapınızda veya şemanızda listelenmemiş olsa bile, raylar onu arar. Bu öksüz taşıma işlemlerini şunu çalıştırarak ortaya çıkarabilirsiniz:

rails db:migrate:status

Eksik geçişlerin sürümlerini not edin ve db konsoluna gidin:

rails dbconsole

Şimdi sürümleri taşıma tablosundan manuel olarak kaldırın:

delete from schema_migrations where version='<version>';

Şimdi iyi olmalısın.


0

Ben de aynı sorunu yaşadım:

  1. rails d migration fuu -bu son zaman damgası ile geçişi sildi
  2. rails d migration fuu -bu diğer geçişi sildi
  3. artık izlenmeyen dosyalarda olmadığını kontrol etmek için git durumunu kullan
  4. raylar g göçme fuu

Bu benim için sorunumu çözdü


0

Yan Not: Raylardan başlamak için 5.0.0 rakedeğiştirildi rails Bu nedenle aşağıdakileri yapın

raylar db: geçiş VERSİYONU = 0

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.