Sadece bir geçişi komisyonlayın


95

Raylar uygulamamda bir gruptan sadece bir geçiş yapmaya çalışıyorum. Bunu nasıl yapabilirim? Hiçbir taşıma işleminden önce veya sonra çalıştırmak istemiyorum. Teşekkürler.


2
Bu kullanışlı bir raylar özelliği olabilir: bir STEP=nargüman ekleyin db:migrate(burada nçalıştırılacak geçiş sayısı, aynen olduğu gibi db:rollback) - o zaman yapabilir rake db:migrate STEP=1veya rake db:migrate STEP=2vb.
user664833

Yanıtlar:


165

rake db:migrate:redo VERSION=xxxxxxx, ancak bu downve ardından upadımı çalıştıracaktır . Bunu, aşağı adımın geçici olarak yorumlanmasıyla birlikte yapabilirsiniz.


Hmm, blog.stonean.com/2007/12/18/rake-dbmigrateredo , :: redo bir VERSION argümanı almıyor gibi görünüyor.
Terry G Lorber

3
@pedrorolo: Bu modası geçmiş değil. Bu görevin açıklaması yok ve bu nedenle içinde görünmeyecek rake -T.
Ryan Bigg

1
@pedrorolo: db:test:prepareo listede de görünmüyor. Tanrım partiye geç kaldım.
mraaroncruz

9
, Masa Raylar veritabanı dışarıdan düşmüşse Ryan, söylediklerine genişletmek için rake db:migrate:up VERSION=my_versionyapabilir şey schema_migrations tablo hala koşmak olmuştur söylüyor çünkü. Aynı durumda rake db:migrate:redo VERSION=my_versionolabilir başarısız da tablo bırakamazsınız nedeniyle. Bu durumda, geçişteki downyöntemi geçici olarak yorumlayın ve yeniden çalıştırınrake db:migrate:redo...
Aslan

3
Ve @Leo'nun söylediği şeyi genişletmek için, taşıma def değişikliği ile tanımlanmışsa, yukarıdakine ek olarak def self.up olarak değiştirin.
valk

70
rake db:migrate:up VERSION=1234567890

benzer rake db:migrate:downşekilde belirli bir geçişi azaltmak için. İle mevcut komisyon görevlerinin bir listesini alabilirsiniz rake -T.


4
VERSIONBurada sözü (oluşturulduğu zaman sadece zaman damgası olan) Taşıma dosyaların her biri başında tamsayı değeri olduğunu. Örneğin VERSION=20150720023630,.
aaron-kodlama

3
Sürümler rake db: migrate: status ile güzel bir şekilde görüntüleniyor
jpgeek

Dikkate değer, VERSIONsadece bir ortam değişkenidir, bu nedenle komutta ilk sırada gelebilir veya hatta komuttan önce ayarlanabilir:VERSION=1234567890 rake db:migrate:up
Joshua Pinter

25

Değişen ve diğer tüm geçişlerden bağımsız olarak yeniden çalıştırılması gereken tek bir taşıma çalıştırmak zorunda kaldım. Konsolu çalıştırın ve şunu yapın:

>> require 'db/migrate/your_migrations.rb'
=> ["YourMigrations"]
>> YourMigrations.up
=> etc... as the migration runs
>> YourMigration.down

Daha kullanışlı bir şekilde, bu bir komisyon görevine vb. Konulabilir.


6
Bu harika çalıştı. Ayrıca sınıfı tanımlamak için geçişten kodu kopyalayıp konsola yapıştırabilirsiniz (ve bu, örneğin Dev'de bir hata yaptıysanız gerekirse manuel işlem yapılmasına izin verir). changeYourMigrations.migrate(:up):down
İle

1
yapmanız gerekebilirrequire "#{Rails.root}/db/migrate/your_migrations.rb"
s2t2

16

rake db:migrate:up VERSION=version_no

Belirli taşıma komut dosyasını taşıyacak (ekleyecek)

rake db:migrate:down VERSION=version_no

Belirli taşıma komut dosyasını silecek


11
rake db:migrate VERSION=20098252345

bir dene.


8
Sanırım bu, belirttiğinize kadar tüm taşımaları çalıştıracak.
Ken Liu

1
yakın, ancak bu aynı zamanda belirli geçişten önce herhangi bir taşıma gerçekleştirir.
Anon

6
Kendinden öncekileri düşünmeden yalnızca bir geçiş yapmanız gerektiğini / bunu yapmak istemeniz gerektiğini düşünmüyorum. Geçiş, belirli bir zamandaki kodla ilgili olduğu için veritabanı yapısının ve dolayısıyla gerekli olmadan önceki geçişlerin bir temsilidir. Yalnızca tek bir geçiş yapmak istiyorsanız, büyük olasılıkla geçişleri işlevsel tutmak için uygun yukarı / aşağı işlemleri yazmamışsınızdır ... yalnızca yukarı geçişlerinizi yazmak kötü bir alışkanlıktır.
JP Silvashy

1
Dikkate değer: VERSIONsadece bir ortam değişkeni olduğundan komutta ilk sırada gelebilir veya hatta komuttan önce ayarlanabilir:VERSION=20098252345 rake db:migrate
Joshua Pinter

4
rake db:migrate:redo version='xxxx'   

Tırnak işaretini xxxx'in önüne koymayı unutmayın; xxxx, geçişiniz için zaman damgasıdır (veya Taşıma Kimliği).

Şunu kullanarak yaptığınız önceki taşıma işlemlerinin zaman damgalarını (Taşıma Kimliği) kontrol edebilirsiniz.

rake db:migrate:status    

3

Yukarıdaki korch yanıtını genişletmek requirebenim için işe yaramadı, ama işe loadyaradı. Somut olmak gerekirse, geçiş dosyası için:

    class ChangeMinQuantityToRaces < ActiveRecord::Migration
      def change
        change_column :races, :min_quantity, :integer, :default => 0
      end
    end

konsolda yazarak

    > load 'db/migrate/30130925110821_change_min_quantity_to_races.rb'
    > ChangeMinQuantityToRaces.new.change

benim için çalıştı.

    > Race.new.min_quantity # => 0 

Bu Ruby 1.9.3p484 (2013-11-22 revizyon 43786) [x86_64-linux] ve Rails 3.2.13 içindi.


2

Buna 2 ¢ ekledim çünkü aynı sorunla karşılaştım:

Yeni bir tane oluşturmadan bir geçişi kesinlikle tekrar çalıştırmak istiyorsanız, aşağıdakileri yapabilirsiniz:

rails dbconsole -p devdb=# delete from public.schema_migrations where version = '20150105181157';

Ve raylar, 20150105181157 için geçişi çalıştırdığını "unutacak". Şimdi db: migrate çalıştırdığınızda onu yeniden çalıştıracak.

Bu neredeyse her zaman kötü bir fikirdir. Bunun mantıklı olabileceği tek örnek, bir geliştirme dalınız varsa ve geçişinizi henüz detaylandırmadıysanız ve geliştirme aşamasında ona bazı şeyler eklemek istiyorsanız. Ancak o zaman bile, geçişinizi 2 yönlü yapmak daha iyidir, böylece düzgün bir şekilde geri alabilir ve tekrar tekrar deneyebilirsiniz.


1

Geçiş sınıfını konsol aracılığıyla çalıştırmanın bir yolu olmalı. Görünüşe göre taşıma kodunu tanınabilir hale getiremiyorum.

Ancak yorumların da gösterdiği gibi, geçişleri sırayla çalıştırmak tercih edilir. Kullanım:

rake db:migrate VERSION=##########

Kodunuzu komut dosyası / konsola taşıma sırasında kopyalayıp yapıştırmak istiyor musunuz?



0

Bir geçişi önemli miktarda değiştirdiğimde bu tekniği geliştirmede kullanıyorum ve bir ton aşağı taşımak ve yoldaki verileri kaybetmek istemiyorum (özellikle uzun süren eski verileri içe aktarırken Yeniden içe aktarmak zorunda kalmak istemiyorum).

Bu% 100 bilgisayar korsanlığıdır ve bunu üretimde yapmayı kesinlikle önermem, ancak işe yarar:

  1. Dizinden yeniden çalıştırmak istediğiniz taşıma işlemini geçici bir yere taşıyın
  2. Aynı ada sahip başka bir geçiş oluşturun
  3. Orijinal geçiş kodunu yeni oluşturulan geçiş dosyasına kopyalayın / yapıştırın
  4. Yeni geçişi çalıştırın
  5. Yeni oluşturulan geçiş dosyasını silin
  6. En son değeri kaldırmak için şema geçişlerinizi düzenleyin
  7. Eski taşıma dosyasını geri yükleyin
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.