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.
Yanıtlar:
rake db:migrate:redo VERSION=xxxxxxx
, ancak bu down
ve ardından up
adımı çalıştıracaktır . Bunu, aşağı adımın geçici olarak yorumlanmasıyla birlikte yapabilirsiniz.
rake -T
.
db:test:prepare
o listede de görünmüyor. Tanrım partiye geç kaldım.
rake db:migrate:up VERSION=my_version
yapabilir şey schema_migrations tablo hala koşmak olmuştur söylüyor çünkü. Aynı durumda rake db:migrate:redo VERSION=my_version
olabilir başarısız da tablo bırakamazsınız nedeniyle. Bu durumda, geçişteki down
yöntemi geçici olarak yorumlayın ve yeniden çalıştırınrake db:migrate:redo...
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
.
VERSION
Burada 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
,.
VERSION
sadece bir ortam değişkenidir, bu nedenle komutta ilk sırada gelebilir veya hatta komuttan önce ayarlanabilir:VERSION=1234567890 rake db:migrate:up
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.
change
YourMigrations.migrate(:up)
:down
require "#{Rails.root}/db/migrate/your_migrations.rb"
rake db:migrate VERSION=20098252345
bir dene.
VERSION
sadece bir ortam değişkeni olduğundan komutta ilk sırada gelebilir veya hatta komuttan önce ayarlanabilir:VERSION=20098252345 rake db:migrate
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
Yukarıdaki korch yanıtını genişletmek require
benim için işe yaramadı, ama işe load
yaradı. 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.
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.
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?
Bunu geliştirmede çok kolaylaştıran bir yardımcı yöntemim var. Bunun çok fazla geçiş oluşturmaktan kaçınmama yardımcı olduğunu görüyorum - normalde taşımaları dağıtılıncaya kadar değiştiriyorum.
http://fullware.net/index.php/2011/05/26/easily-load-rails-migrations-for-console-execution/
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:
STEP=n
argüman ekleyindb:migrate
(buradan
çalıştırılacak geçiş sayısı, aynen olduğu gibidb:rollback
) - o zaman yapabilirrake db:migrate STEP=1
veyarake db:migrate STEP=2
vb.