Tek bir taşıma dosyası çalıştırın


267

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.


Bu, bir kez geçiş olarak çalıştırdığınız bir şey mi, çünkü gerekli olduğu için, daha sonra birkaç kez çalıştırılması gerekebilecek yararlı bir sorgu olduğu ortaya çıkıyor mu? belki de geçişin içeriğini bir modele veya başka bir nesneye yeniden düzenlemeniz gerekir, ardından taşıma işleminin bu yeni konuma başvurmasını sağlamalısınız. Ardından komut satırında ruby'yi çağırarak yeni nesneyi lezzetinizde yürütebilirsiniz.
Nathan Feger

Yanıtlar:


240

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.


59
Bazen, gerekli yolun önünde bir './' gerekir ve bu kesinlikle schema_migrations'ı güncellemez.
Beardo

14
Arama yapmadan önce geçiş nesnesinin bir örneğini oluşturmak zorunda kaldım. ör.AddFoos.new.up
Bentleyo

15
Yani, Rails 3.2 için özetlemek için: require "./db/migrate/db/migrate/20090408054532_add_foos.rb"o zamanAddFoos.new.up
trisweb

50
changeupdownAddFoos.new.migrate(:up)
Göçünüz

6
Raylarda 4, arayabilirsinizAddFoos.new.change
lfender6445

429

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 .


124
Aslında komut komisyon db: migrate: redo SÜRÜM = my_version
Chirag Patel

2
@Chirag Patel: Tam da aradığım şey bu! Teşekkürler!
Abel

23
yineleme işlemi, verilen taşıma işleminin aşağı yöntemini ve bundan sonra da yukarı yöntemini çalıştırır. up sadece up yöntemini çalıştırır ve bence soran kişi tam da budur.
Sven Koschnicke

7
Veritabanı şeması sürümü söz konusu geçişten daha geç ise 'up' çalışmıyor gibi görünüyor, örneğin başka bir kişinin değişikliklerini birleştirirken gerçekleşebilir.
Matt Connolly

3
Teşekkürler, bunu aşağı için kullandımrake db:migrate:down VERSION=XXX
Nitrodist

107

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 .


Hem "yukarı" hem de "yinele" benim için çalışmadı, ancak schema_migrations içindeki satırı silmek mükemmeldi.
cesoid

27

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)

1
Bu, upve öğelerini kullanıyor olsanız bile geçerlidir down.
gak

17

Bu "" 20150927161307_create_users.rb "taşıma dosyasını yeniden çalıştırma adımlarıdır

  1. Konsol modunu çalıştırın. (raylar c)
  2. 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
  3. Sınıfın bir örneğini oluşturun CreateUsers:c1 = CreateUsers.new

  4. changeBu örneğin yöntemini yürütün :c1.change

sınıfla birlikte dosyaya ihtiyacınız var, örneğin konsolda: 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.
VinnyQ77

13

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

1
ayrıca neye ihtiyacınız olduğunu tahminrails db:migrate VERSION=20160920130051
frenesim

12

Yollarda sorun yaşıyorsanız kullanabilirsiniz

require Rails.root + 'db/migrate/20090408054532_add_foos.rb'

6

Yöntem 1 :

rake db:migrate:up VERSION=20080906120000

Yöntem 2:

Rails Console'da 1. Taşıma sınıfını konsola yapıştırın (add_name_to_user.rb diyelim) 2. Ardından konsolda aşağıdakileri yazın

Sharding.run_on_all_shards{AddNameToUser.up}

Tamamdır!!


5

Yeni ray ortamlarında script/runnerkullanmak zorunda kalacağınızı lütfen unutmayın rails runner.


3

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.


1

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.

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.