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.up
bunun 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_migrations
tabloyu 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
change
up
down
AddFoos.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_migrations
tablodaki bir girişle belirtilir . Yeniden çalıştırmak için rake db:migrate:redo VERSION=20090408054532
bunun 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:migrate
daha sonra up
nükleer göçlerin yöntemini yeniden çalıştıracaktır .
Bunun change
gibi 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)
up
ve öğ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
end
Sınıfın bir örneğini oluşturun CreateUsers
:c1 = CreateUsers.new
change
Bu örneğin yöntemini yürütün :c1.change
require "./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 5
kullanmak rails
yerine 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/runner
kullanmak 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.root
benim 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 SCOPE
ortam 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.rb
ve 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.