Belirli bir taşıma işlemi nasıl geri alınır?


807

Aşağıdaki taşıma dosyasına sahibim db\migrate\20100905201547_create_blocks.rb

Bu taşıma dosyasını özel olarak nasıl geri alabilirim?


1
Bu sorunu ele alıyor mu? Tek yapmanız gereken Class.down stackoverflow.com/questions/753919/run-a-single-migration-file
danivovich


1
Yalnızca bu tek geçişi geri almak istiyor musunuz (bundan sonra gelen daha yeni geçişler olsa bile)? Veya veritabanını bu taşıma işleminden önceki durumuna geri döndürmek mi, yoksa sonraki taşıma işlemleri mi uygulanıyor?
Jon Schneider

Yanıtlar:


1340
rake db:rollback STEP=1

Geri almak istediğiniz geçiş en son uygulanan ise, bunu yapmanın bir yoludur. Geri dönmek istediğiniz pek çok taşıma işleminin yerine 1 kullanabilirsiniz.

Örneğin:

rake db:rollback STEP=5

Daha sonra gerçekleşen tüm göçleri de geri alacak (4, 3, 2 ve ayrıca 1).

Tüm taşıma işlemlerini bir hedef taşıma işlemine geri döndürmek (ve dahil etmek) için şunu kullanın: (Bu düzeltilmiş komut, orijinal gönderideki hatayı gösteren tüm yorumlar SONRASI eklenmiştir)

rake db:migrate VERSION=20100905201547

YALNIZCA belirli bir taşıma işlemini (SİPARİŞ DIŞI) geri almak için şunu kullanın:

rake db:migrate:down VERSION=20100905201547

Bunun, araya giren geçişleri - yalnızca listelenenleri - geri almayacağını unutmayın. İstediğiniz bu değilse, güvenle çalıştırabilirsiniz rake db:migrateve daha önce geri alınmamış olanları atlayarak yalnızca onu yeniden çalıştıracaktır.

Tek bir göçü düzensiz olarak taşımak isterseniz, bunun tersi de vardır db:migrate:up:

rake db:migrate:up VERSION=20100905201547

14
"Belirli bir sürüme geri dönmek için" - izleyen komut, bu sürüme geri dönmek yerine yalnızca belirli bir geçişi geri almaz mı?
Andrew Grimm

10
"Belirli bir sürüme geri dönmek için ..." Bu cevap yanlış! Bu, diğer yanıtlarla açıklandığı gibi geçişi tek başına geri alacaktır.
Rhys van der Waerden

3
UYARI: Bu hatayı yaptım: İZOLASYONDA geri almak için sadece db: migrate: down VERSION = 20100905201547 kullanın !!! bir taşıma dosyası. Bu, yukarıdaki yorumda belirtilmiştir, ancak özledim.
pixelearth

3
Bir uyarı daha - asla yapma STEP=-1. Bunu bir kez yaptım ve her şeyi geri alarak delirdi. İyi değil! Bu Rails 4.2 idi - Sanırım şimdiye kadar düzeltilmiş olabilir.
Dave Hartnoll

1
Blogumda, bu komutların nasıl ve ne zaman kullanılacağını açıklayan geçişler hakkında bir makale yazdı: railsguides.net/polish-rails-migrations
ka8725

867
rake db:migrate:down VERSION=20100905201547

söz konusu dosyayı geri alır.


Tüm taşıma işlemlerinin sürümünü bulmak için şu komutu kullanabilirsiniz:

rake db:migrate:status

Veya, taşımanın dosya adının öneki, geri almanız gereken sürümdür.


Taşımalarla ilgili Ruby on Rails kılavuz girişine bakın .


48
Bence kesinlikle tercih edilen cevap.
streetlogics

30
Belirli bir taşıma işlemini geri alır ve yaklaşan komisyon görevlerinde yeniden taşınmasını istemiyorsanız, taşıma dosyasını da silmeniz gerekir.
BradGreens

4
Not: Görünüşe göre yukarı taşıma hiç başarılı olmadı, ancak yalnızca kısmen yürütüldüyse, aşağı hiçbir şey yapmaz.
cyrilchampier

1
@nerith, muhtemelen yalnızca İşlemsel DDL'yi desteklemeyen veritabanları için geçerlidir. MySQL, İşlemsel DDL'yi desteklemez: dev.mysql.com/doc/refman/5.0/en/cannot-roll-back.html PostreSQL şunları yapar: wiki.postgresql.org/wiki/… MySQL veritabanındaki geçişiniz bozulursa başarılı olan taşıma işleminin bir bölümünü el ile silmeniz gerekir.
Иван Бишевац

1
@BradGreens ile ilgili bir başka gözlem daha. Geçiş dosyasını kaldırmak istiyorsanız ve zaten konuşlandırıldıysa, kodu kaldırılan dosyayla işlemeden önce üretimi / aşamayı geri almak istersiniz. Aksi takdirde geri alma / taşıma: aşağı alamazsınız.
AdamT

57

Son taşımayı geri almak için şunları yapabilirsiniz:

rake db:rollback

Bir sürümle belirli bir taşımayı geri almak istiyorsanız yapmanız gerekenler:

rake db:migrate:down VERSION=YOUR_MIGRATION_VERSION

Örneğin, sürüm 20141201122027 ise, şunları yapacaksınız:

rake db:migrate:down VERSION=20141201122027

belirli bir geçişi geri almak için.


32

rake db:rollbackFarklı seçeneklerle taşıma işleminizi geri alabilirsiniz . Sözdizimi gereksinimlerinize göre farklı olacaktır.

Yalnızca son geçişi geri almak istiyorsanız,

rake db:rollback

veya

rake db:rollback STEP=1

Bir seferde taşıma işlemlerinin geri alma sayısını istiyorsanız, yalnızca bir bağımsız değişken iletirsiniz:

rake db:rollback STEP=n

Burada n, en son taşıma işleminden itibaren geri alma işlemine geçirilen taşıma sayısıdır.

Belirli bir taşıma işlemine geri dönmek istiyorsanız, taşıma sürümünü aşağıda belirtmeniz gerekir:

rake db:migrate:down VERSION=xxxxx

burada xxxxx, taşıma işleminin sürüm numarasıdır.


1
ekleme: aşağı olsa çalışmıyor, doğru cevap aşağı olmadan
Elta3lab

26

rake db:migrate:down VERSION=your_migrations's_version_number_here

Sürüm, geçişin dosya adındaki sayısal önektir

Sürüm nasıl bulunur :

Taşıma dosyalarınız rails_root/db/migratedizininizde saklanır . Geri almak istediğiniz uygun dosyayı bulun ve önek numarasını kopyalayın.

Örneğin

dosya adı: 20140208031131_create_roles.rb o zaman sürüm20140208031131


6
Geçiş kimliğini bulmanın en basit yolu çalıştırmaktırrake db:migrate:status
Aeradriel

18

Son taşıma işlemini geri alma:

# rails < 5.0
rake db:rollback

# rails >= 5.0
rake db:rollback
# or
rails db:rollback

Son ntaşıma sayısını geri alma

# rails < 5.0
rake db:rollback STEP=2

# rails >= 5.0
rake db:rollback STEP=2
# or
rails db:rollback STEP=2

Belirli bir taşımayı geri alma

# rails < 5.0
rake db:migrate:down VERSION=20100905201547

# rails >= 5.0
rake db:migrate:down VERSION=20100905201547
# or
rails db:migrate:down VERSION=20100905201547

14

Son taşımayı geri almak için şunları yapabilirsiniz:

rake db:rollback

Bir sürümle belirli bir taşımayı geri almak istiyorsanız yapmanız gerekenler:

rake db:migrate:down VERSION=YOUR_MIGRATION_VERSION

Geri almak istediğiniz geçiş dosyası çağrıldıysa db/migrate/20141201122027_create_some_table.rb, söz konusu taşımanın SÜRÜMÜ, söz konusu taşımanın 20141201122027ne zaman oluşturulduğunun zaman damgasıdır ve taşımayı geri alma komutu şu şekildedir:

rake db:migrate:down VERSION=20141201122027

6

Tersinir bir geçişse ve en son yürütülen göçse, çalıştırın rake db:rollback. Ve her zaman sürümü kullanabilirsiniz. Örneğin

taşıma dosyası 20140716084539_create_customer_stats.rb olduğundan, geri alma komutu rake db:migrate:down VERSION=20140716084539


6

Geri almak için belirli bir sürümüne Tüm taşıma işlemlerini kadar (örneğin 20181002222222), kullanım:

rake db:migrate VERSION=20181002222222

(Not bu kullanımları db:migrate- değil db:migrate:down. Bu soruya diğer cevaplar olduğu gibi)

Belirtilen taşıma sürümünün geçerli sürümden daha eski olduğu varsayılırsa, bu, belirtilen sürüme kadar olan ancak olmayan tüm geçişleri geri alır.

Örneğin, rake db:migrate:statusbaşlangıçta aşağıdakileri görüntülerse:

  (... some older migrations ...)
  up      20181001002039  Some migration description
  up      20181002222222  Some migration description
  up      20181003171932  Some migration description
  up      20181004211151  Some migration description
  up      20181005151403  Some migration description

Koşu:

rake db:migrate VERSION=20181002222222

Sonuçlanacak:

  (... some older migrations ...)
  up      20181001002039  Some migration description
  up      20181002222222  Some migration description
  down    20181003171932  Some migration description
  down    20181004211151  Some migration description
  down    20181005151403  Some migration description

Referans: https://makandracards.com/makandra/845-migrate-or-revert-only-some-migrations


4

Gönderen Raylar Rehberi

Önceki Taşımaların Geri Alınması

Active Record'un taşımaları geri alma yeteneğini aşağıdaki revertyöntemi kullanarak kullanabilirsiniz :

require_relative '20100905201547_create_blocks'

class FixupCreateBlock < ActiveRecord::Migration
  def change
    revert CreateBlock

    create_table(:apples) do |t|
      t.string :variety
    end
  end
end

revertYöntem ayrıca, tersine çevirmek için talimatlar bloğunu kabul eder. Bu, önceki taşıma işlemlerinin seçilen bölümlerini geri almak için yararlı olabilir. Örneğin, CreateBlock'un taahhüt edildiğini ve daha sonra posta kodunu doğrulamak için CHECK kısıtlaması yerine Aktif Kayıt doğrulamalarının kullanılmasının en iyi olacağına karar verelim.

    class DontUseConstraintForZipcodeValidationMigration < ActiveRecord::Migration
      def change
        revert do
          # copy-pasted code from CreateBlock
          reversible do |dir|
            dir.up do
              # add a CHECK constraint
              execute <<-SQL
                ALTER TABLE distributors
                  ADD CONSTRAINT zipchk
                    CHECK (char_length(zipcode) = 5);
              SQL
            end
            dir.down do
              execute <<-SQL
                ALTER TABLE distributors
                  DROP CONSTRAINT zipchk
              SQL
            end
          end

          # The rest of the migration was ok
        end
      end
    end

Aynı geçiş, geri döndürme olmadan da yazılmış olabilir, ancak bu birkaç adım daha içerebilirdi: create_table ve reversible sırasını tersine çevirme, create_table'ı drop_table ile değiştirme ve son olarak down ile değiştirme ve tersi. Tüm bunlar geri döndürülerek halledilir.


3

Taşıma işlemleri şu komutu kullanarak veritabanının durumunu değiştirir:

$ bundle exec rake db:migrate

Kullanarak tek bir taşıma adımını geri alabiliriz

  $ bundle exec rake db:rollback

Başlangıca geri dönmek için

  $ bundle exec rake db:migrate VERSION=0

Tahmin edebileceğiniz gibi, başka herhangi bir sayının yerine 0 girilmesi, sürüm numaralarının geçişleri sırayla listelemesinden geldiği sürüm numarasına taşınır.


2

Raylarda 5 oldukça kolay tırmık db: migrate: status veya rails db: migrate: status

Her ikisini de aynı şekilde işlemek için değiştirildi Sonra geri almak istediğiniz Sürümü seçin ve daha sonra komisyon db'yi çalıştırın: migrate VERSION = 2013424230423

VERSION öğesinin büyük harf olduğundan emin olun

Taşıma işleminin herhangi bir adımıyla ilgili bir sorununuz varsa veya ortada sıkışıp kalmışsanız, taşıma dosyasına gidin ve önceden taşınan satırları yorumlayın.

umarım yardımcı olur


1
Komut komisyonu db: migrate: status ipucunu vurguluyorum . . . Genel bakış için taşıma dosyalarının geçerli yürütme durumunu görmek harika.
Güzellik

1

Geri almak ve taşımak istiyorsanız şunları çalıştırabilirsiniz:

rake db:migrate:redo

Bu aynı:

rake db:rollback
rake db:migrate
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.