Bagaimana cara mengembalikan migrasi tertentu?

807

Saya memiliki file migrasi berikut db\migrate\20100905201547_create_blocks.rb

Bagaimana saya dapat secara khusus mengembalikan file migrasi itu?

AnApprentice
sumber
1
Apakah ini mengatasi masalah? Anda hanya perlu melakukan Class.down stackoverflow.com/questions/753919/run-a-single-migration-file
danivovich
4
Setiap informasi tentang migrasi di Sini
Nishutosh Sharma
1
Apakah Anda ingin mengembalikan hanya satu migrasi spesifik (bahkan jika ada migrasi baru yang datang setelah itu)? Atau Anda ingin mengembalikan database ke keadaan sebelum migrasi itu, dan migrasi berikutnya, diterapkan?
Jon Schneider

Jawaban:

1341
rake db:rollback STEP=1

Adalah cara untuk melakukan ini, jika migrasi yang ingin Anda kembalikan adalah yang terakhir diterapkan. Anda dapat mengganti 1 untuk berapa banyak migrasi yang ingin Anda kembali.

Sebagai contoh:

rake db:rollback STEP=5

Juga akan mengembalikan semua migrasi yang terjadi nanti (4, 3, 2 dan juga 1).

Untuk mengembalikan semua migrasi kembali ke (dan termasuk) migrasi target, gunakan: (Perintah terkoreksi ini ditambahkan SETELAH semua komentar yang menunjukkan kesalahan dalam posting asli)

rake db:migrate VERSION=20100905201547

Untuk mengembalikan HANYA SATU migrasi tertentu (OUT OF ORDER) gunakan:

rake db:migrate:down VERSION=20100905201547

Perhatikan bahwa ini TIDAK akan mengembalikan setiap migrasi perantara - hanya yang terdaftar. Jika bukan itu yang Anda maksudkan, Anda dapat menjalankannya dengan aman rake db:migratedan hanya akan menjalankannya kembali, melewatkan yang lainnya yang sebelumnya tidak diputar.

Dan jika Anda ingin memigrasi satu migrasi saja, ada juga kebalikannya db:migrate:up:

rake db:migrate:up VERSION=20100905201547
Zachary Wright
sumber
14
"Untuk mengembalikan ke versi tertentu" - bukankah perintah yang mengikuti hanya mengembalikan migrasi tertentu, daripada memutar balik ke versi itu?
Andrew Grimm
10
"Untuk mengembalikan ke penggunaan versi tertentu ..." Jawaban ini salah! Ini akan mengembalikan migrasi secara terpisah seperti yang dijelaskan oleh jawaban lain.
Rhys van der Waerden
3
PERINGATAN: Saya membuat kesalahan ini: hanya menggunakan rake db: migrate: down VERSION = 20100905201547 untuk rollback IN ISOLATION !!! satu file migrasi. Ini disebutkan dalam komentar di atas, tetapi saya melewatkannya.
pixelearth
3
Kata peringatan lain - jangan pernah lakukan STEP=-1. Saya melakukannya sekali dan itu menjadi gila, memutar kembali semuanya. Tidak baik! Ini adalah Rails 4.2 - Saya kira mungkin sudah diperbaiki sekarang.
Dave Hartnoll
1
Menulis sebuah artikel di blog saya tentang migrasi, yang menjelaskan bagaimana dan kapan menggunakan perintah ini: railsguides.net/polish-rails-migrations
ka8725
867
rake db:migrate:down VERSION=20100905201547

akan memutar kembali file tertentu.


Untuk menemukan versi semua migrasi, Anda dapat menggunakan perintah ini:

rake db:migrate:status

Atau, awalan dari nama file migrasi adalah versi yang Anda harus kembalikan.


Lihat entri panduan Ruby on Rails tentang migrasi.

John Creamer
sumber
48
Pasti jawaban yang disukai menurut saya.
streetlogics
30
Perlu disebutkan bahwa jika Anda memutar kembali migrasi tertentu dan tidak ingin migrasi kembali pada tugas rake yang akan datang, maka hapus juga file migrasi.
BradGreens
4
Catatan: tampaknya jika migrasi naik tidak pernah berhasil tetapi hanya sebagian dieksekusi, down tidak melakukan apa-apa.
cyrilchampier
1
@nerith, itu mungkin benar hanya untuk database yang tidak mendukung Transactional DDL. MySQL tidak mendukung Transactional DDL: dev.mysql.com/doc/refman/5.0/en/cannot-roll-back.html PostreSQL tidak: wiki.postgresql.org/wiki/… Jadi jika migrasi Anda pada database MySQL rusak maka Anda harus secara manual menghapus bagian dari migrasi yang berhasil.
Иван Бишевац
1
Pengamatan lain tentang komentar @BradGreens. Jika Anda ingin menghapus file migrasi, dan itu sudah digunakan, Anda akan ingin memutar kembali produksi / pementasan sebelum Anda melakukan kode dengan file yang dihapus. Kalau tidak, Anda tidak akan dapat mengembalikan / bermigrasi: turun.
AdamT
57

Untuk mengembalikan migrasi terakhir yang dapat Anda lakukan:

rake db:rollback

Jika Anda ingin mengembalikan migrasi tertentu dengan versi yang harus Anda lakukan:

rake db:migrate:down VERSION=YOUR_MIGRATION_VERSION

Misalnya, jika versinya 20141201122027, Anda akan melakukan:

rake db:migrate:down VERSION=20141201122027

untuk mengembalikan migrasi spesifik itu.

Waleed
sumber
32

Anda dapat mengembalikan migrasi dengan menggunakan rake db:rollbackberbagai opsi. Sintaks akan berbeda sesuai dengan kebutuhan Anda.

Jika Anda ingin mengembalikan hanya migrasi terakhir, maka Anda dapat menggunakan keduanya

rake db:rollback

atau

rake db:rollback STEP=1

Jika Anda ingin mengembalikan jumlah migrasi sekaligus, maka Anda cukup memberikan argumen:

rake db:rollback STEP=n

di mana njumlah migrasi ke rollback, dihitung dari migrasi terbaru.

Jika Anda ingin mengembalikan ke migrasi tertentu, maka Anda harus meneruskan versi migrasi sebagai berikut:

rake db:migrate:down VERSION=xxxxx

di mana xxxxx adalah nomor versi migrasi.

uma
sumber
1
menambahkan: turun tidak berfungsi, jawaban yang benar adalah tanpa turun
Elta3lab
26

rake db:migrate:down VERSION=your_migrations's_version_number_here

Versi ini adalah awalan angka pada nama file migrasi

Cara menemukan versi :

File migrasi Anda disimpan di rails_root/db/migratedirektori Anda . Temukan file yang sesuai yang ingin Anda kembalikan dan salin nomor awalannya.

sebagai contoh

nama file: 20140208031131_create_roles.rb maka versinya adalah20140208031131

Hardik
sumber
6
Cara termudah untuk menemukan id migrasi adalah menjalankanrake db:migrate:status
Aeradriel
18

Meluncurkan kembali migrasi terakhir:

# rails < 5.0
rake db:rollback

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

Mengembalikan njumlah migrasi terakhir

# rails < 5.0
rake db:rollback STEP=2

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

Mengembalikan migrasi tertentu

# 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
Deepak Mahakale
sumber
14

Untuk mengembalikan migrasi terakhir yang dapat Anda lakukan:

rake db:rollback

Jika Anda ingin mengembalikan migrasi tertentu dengan versi yang harus Anda lakukan:

rake db:migrate:down VERSION=YOUR_MIGRATION_VERSION

Jika file migrasi yang ingin Anda kembalikan dipanggil db/migrate/20141201122027_create_some_table.rb, maka VERSI untuk migrasi itu adalah 20141201122027, yang merupakan cap waktu kapan migrasi itu dibuat, dan perintah untuk mengembalikan migrasi itu adalah:

rake db:migrate:down VERSION=20141201122027
Sandip Vavhal
sumber
6

Jika ini adalah migrasi reversibel dan yang terakhir yang telah dieksekusi, maka jalankan rake db:rollback. Dan Anda selalu dapat menggunakan versi. misalnya

file migrasi adalah 20140716084539_create_customer_stats.rb, jadi perintah rollback adalah, rake db:migrate:down VERSION=20140716084539

Santanu
sumber
6

Untuk mengembalikan semua migrasi ke versi tertentu (mis. 20181002222222), Gunakan:

rake db:migrate VERSION=20181002222222

(Perhatikan bahwa ini menggunakan db:migrate- bukan db:migrate:downseperti pada jawaban lain untuk pertanyaan ini.)

Dengan asumsi versi migrasi yang ditentukan lebih tua dari versi saat ini, ini akan memutar kembali semua migrasi hingga, tetapi tidak termasuk, versi yang ditentukan.

Misalnya, jika rake db:migrate:statusawalnya menampilkan:

  (... 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

Berlari:

rake db:migrate VERSION=20181002222222

Akan menghasilkan:

  (... 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

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

Jon Schneider
sumber
4

Dari Rails Guide

Mengembalikan Migrasi Sebelumnya

Anda dapat menggunakan kemampuan Rekaman Aktif untuk mengembalikan migrasi menggunakan revertmetode:

require_relative '20100905201547_create_blocks'

class FixupCreateBlock < ActiveRecord::Migration
  def change
    revert CreateBlock

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

The revertMetode juga menerima blok instruksi untuk mundur. Ini bisa berguna untuk mengembalikan bagian-bagian tertentu dari migrasi sebelumnya. Misalnya, mari kita bayangkan bahwa CreateBlock dikomit dan kemudian diputuskan akan lebih baik untuk menggunakan validasi Rekaman Aktif, sebagai pengganti batasan PERIKSA, untuk memverifikasi kode pos.

    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

Migrasi yang sama juga bisa ditulis tanpa menggunakan revert, tetapi ini akan melibatkan beberapa langkah lagi: membalik urutan create_table dan reversibel, mengganti create_table dengan drop_table, dan akhirnya mengganti naik turun dan sebaliknya. Ini semua diurus dengan mengembalikan.

Manish Shrivastava
sumber
3

Migrasi mengubah status basis data menggunakan perintah

$ bundle exec rake db:migrate

Kami dapat membatalkan satu langkah migrasi menggunakan

  $ bundle exec rake db:rollback

Untuk kembali ke awal, kita bisa menggunakan

  $ bundle exec rake db:migrate VERSION=0

Seperti yang Anda tebak, mengganti nomor lain dengan 0 bermigrasi ke nomor versi itu, tempat nomor versi berasal dari daftar migrasi secara berurutan

Nirupa
sumber
2

Nah di rails 5, cukup mudah rake db: migrate: status atau rails db: migrate: status

Itu dimodifikasi untuk menangani keduanya dengan cara yang sama. Kemudian pilih saja Versi mana yang ingin Anda putar kembali dan kemudian jalankan rake db: migrate VERSION = 2013424230423

Pastikan VERSION adalah huruf kapital semua

Jika Anda memiliki masalah dengan langkah migrasi apa pun atau macet di tengah, buka saja file migrasi dan beri komentar pada baris yang sudah dimigrasi.

Semoga itu bisa membantu

Shahin
sumber
1
Saya menyoroti petunjuk untuk perintah rake db: migrate: status . . . Sangat bagus untuk tinjauan umum untuk melihat status eksekusi saat ini dari file migrasi.
Kecantikan
1

Jika Anda ingin mengembalikan dan bermigrasi, Anda dapat menjalankan:

rake db:migrate:redo

Itu sama dengan:

rake db:rollback
rake db:migrate
Iwan B.
sumber