Tek bir taşıma işlemi gerçekleştirmenin kolay bir yolu var mı? Belirli bir sürüme geçmek istemiyorum Sadece belirli bir sürümü çalıştırmak istiyorum.
Tek bir taşıma işlemi gerçekleştirmenin kolay bir yolu var mı? Belirli bir sürüme geçmek istemiyorum Sadece belirli bir sürümü çalıştırmak istiyorum.
Yanıtlar:
Kodu doğrudan yakut dosyasından çalıştırabilirsiniz:
rails console
>> require "db/migrate/20090408054532_add_foos.rb"
>> AddFoos.up
Not: rayların daha yeni sürümleri AddFoos.new.upbunun yerine gerekebilir AddFoos.up.
Gereksinim duyulan gerçeğe dayanan alternatif bir yol (IRB'siz) bir sınıf adı dizisi döndürür:
script/runner 'require("db/migrate/20090408054532_add_foos.rb").first.constantize.up'
Bunu yaparsanız, muhtemelen schema_migrationstabloyu güncellemeyeceğini unutmayın , ancak yine de istediğiniz gibi görünüyor.
AddFoos.new.up
require "./db/migrate/db/migrate/20090408054532_add_foos.rb"o zamanAddFoos.new.up
changeupdownAddFoos.new.migrate(:up)
AddFoos.new.change
Rails'in oldukça yeni bir sürümünü varsayarsak, her zaman çalıştırabilirsiniz:
rake db:migrate:up VERSION=20090408054532
Burada sürüm, taşıma dosya adındaki zaman damgasıdır.
Düzenleme: Son 8 yıl içinde bir noktada (hangi sürümü emin değilim) Rails zaten çalıştırılmışsa, bu çalışmasını engelleyen kontroller ekledi. Bu schema_migrationstablodaki bir girişle belirtilir . Yeniden çalıştırmak için rake db:migrate:redo VERSION=20090408054532bunun yerine çalıştırmanız yeterlidir .
rake db:migrate:down VERSION=XXX
Belirli bir taşıma işlemi gerçekleştirmek istiyorsanız ,
$ rake db:migrate:up VERSION=20080906120000
Taşıma işlemlerini birden çok kez yapmak istiyorsanız ,
# use the STEP parameter if you need to go more than one version back
$ rake db:migrate:redo STEP=3
Tek bir taşımayı birden çok kez çalıştırmak istiyorsanız ,
# this is super useful
$ rake db:migrate:redo VERSION=20080906120000
(sürüm numarasını taşıma işleminizin dosya adında bulabilirsiniz)
Düzenleme: Ayrıca taşıma dosyanızı yeniden adlandırabilirsiniz, Örn:
20151013131830_my_migration.rb -> 20151013131831_my_migration.rb
Daha sonra normal olarak taşıyın, bu taşıma işlemini daha az kontrole sahip olduğunuz uzak bir ortama (aşamalandırma gibi) geçmek istiyorsanız yeni bir geçiş olarak değerlendirir.
Edit 2 : Veritabanındaki taşıma girişini de tıklayabilirsiniz. Örneğin:
rails_c> q = "delete from schema_migrations where version = '20151013131830'"
rails_c> ActiveRecord::Base.connection.execute(q)
rake db:migratedaha sonra upnükleer göçlerin yöntemini yeniden çalıştıracaktır .
Bunun changegibi bir yöntem uyguladıysanız :
class AddPartNumberToProducts < ActiveRecord::Migration
def change
add_column :products, :part_number, :string
end
end
Sen göç örneğini oluşturabilir ve çalıştırabilir migrate(:up)veya migrate(:down)böyle bir örneğinde:
$ rails console
>> require "db/migrate/20090408054532_add_part_number_to_products.rb"
>> AddPartNumberToProducts.new.migrate(:down)
upve öğelerini kullanıyor olsanız bile geçerlidir down.
Bu "" 20150927161307_create_users.rb "taşıma dosyasını yeniden çalıştırma adımlarıdır
Bu dosyadaki sınıfı konsola kopyalayıp geçebilirsiniz.
class CreateUsers < ActiveRecord::Migration
def change
create_table :users do |t|
t.string :name
t.string :email
t.timestamps null: false end
end
end
endSınıfın bir örneğini oluşturun CreateUsers:c1 = CreateUsers.new
changeBu örneğin yöntemini yürütün :c1.changerequire "./db/migrate/20150927161307_create_users.rb"kopyalama ve yapıştırma yerine. Daha sonra, sınıfta tanımlanan yöntemi başlatarak ve çağırarak sınıfı aynı şekilde çalıştırabilirsiniz CreateUsers.new.change.
Olarak rails 5kullanmak railsyerine kullanabilirsinizrake
Raylar 3-4
# < rails-5.0
rake db:migrate:up VERSION=20160920130051
Raylar 5
# >= rails-5.0
rake db:migrate:up VERSION=20160920130051
# or
rails db:migrate:up VERSION=20160920130051
rails db:migrate VERSION=20160920130051
Yollarda sorun yaşıyorsanız kullanabilirsiniz
require Rails.root + 'db/migrate/20090408054532_add_foos.rb'
Yeni ray ortamlarında script/runnerkullanmak zorunda kalacağınızı lütfen unutmayın rails runner.
Konsoldan çalıştırmak istiyorsanız, aradığınız şey budur:
$ rails console
irb(main)> require "#{Rails.root.to_s}/db/migrate/XXXXX_my_migration.rb"
irb(main)> AddFoo.migrate(:up)
Diğer cevapları denedim, ama Rails.rootbenim için çalışmadı olmadan gerektiren .
Ayrıca, .migrate(:up)bölüm zaten çalışıp çalışmadığına bakılmaksızın göçü yeniden çalışmaya zorlar. Bu, bir göçü çalıştırdığınızda, db ile uğraşarak geri aldığınız ve tekrar sahip olmak için hızlı bir çözüm istediğinizde kullanışlıdır.
En azından en son Rails sürümünde (yazma sırasında 5.2) çalıştırılan taşıma işlemlerini filtrelemenin bir yolu daha var. Bir SCOPEortam değişkenine bir filtre geçirilebilir; bu filtre daha sonra geçiş dosyalarını seçmek için kullanılır.
İki göç dosyaları var varsayarsak 1_add_foos.rbve 2_add_foos.run_this_one.rbçalışan
SCOPE=run_this_one rails db:migrate:up
yalnızca seçer ve çalışır 2_add_foos.run_this_one.rb. Kapsamla eşleşen tüm taşıma dosyalarının çalıştırılacağını unutmayın.