Ruby on Rails: Bagaimana cara mengembalikan migrasi dengan rake db: migrate?


94

Setelah menginstal perangkat MODEL Pengguna saya mendapatkan ini.

class DeviseCreateUsers < ActiveRecord::Migration
  def self.up
    create_table(:users) do |t|
      t.database_authenticatable :null => false
      t.recoverable
      t.rememberable
      t.trackable

      # t.encryptable
      # t.confirmable
      # t.lockable :lock_strategy => :failed_attempts, :unlock_strategy => :both
      # t.token_authenticatable


      t.timestamps
    end

    add_index :users, :email,                :unique => true
    add_index :users, :reset_password_token, :unique => true
    # add_index :users, :confirmation_token,   :unique => true
    # add_index :users, :unlock_token,         :unique => true
    # add_index :users, :authentication_token, :unique => true
  end

  def self.down
    drop_table :users
  end
end

Sekarang jika saya melakukan rake db: migrasi tabel pengguna akan dibuat.

Bagaimana cara mengembalikan migrasi ini, yaitu bagaimana cara menghapus tabel pengguna menggunakan rake lagi?

Jawaban:


147

Jalankan perintah berikut

rake db:migrate:down VERSION=<version>

di mana <version>nomor versi file migrasi yang ingin Anda kembalikan.

misalnya. jika Anda ingin mengembalikan migrasi dengan nama file 3846656238_create_users.rb

rake db: migrate: down VERSION = 3846656238


Saya mendapatkan UnknownMigrationVersionErrortetapi saya mengetahuinya karena migrasi saya ada di dalam db/migrate/main, apakah ada yang tahu solusi untuk ini dengan db:migrate:downmelihat ke dalam direktori tertentu atau subdirektori migrasi?
tf.rz

Ini hanya untuk rel 3 dan seterusnya. Hidup saya ada di rel 2. Sedih
morhook

@morhook Ini bekerja untuk rel 3 juga. Periksa dokumen di sini panduan.rubyonrails.org/v3.2/migrations.html
Mahesh

Kamu benar! Ini berfungsi untuk rel 2 dan rel 3. Terima kasih @Mahesh atas masukan Anda!
morhook


65

Saya yakin ada tiga opsi yang tersedia untuk mengembalikan migrasi (mereka juga tumpang tindih):

  1. Turunkan migrasi terbaru :

    rake db:migrate:down # Rel 2 saja.

  2. Gulir ke bawah sejumlah (n) migrasi baru - baru ini:

    rake db:rollback STEP=n

  3. Roll down ke versi sebelumnya, spesifik :

    $ rake db:migrate:down VERSION=nnn # Rails 3 (berikan juga nomor versi).

Nomor Versi berarti SHA (Secure Hash Algorithm) untuk komit yang merupakan bilangan heksadesimal panjang yang terlihat seperti 886af3194768917c78e ... Anda dapat melihatnya dengan melakukan git log

Anda dapat melihat perintah-perintah ini (dan lainnya) dengan deskripsinya dengan menggunakan rake -T db:yang untuk rails 3.2 meliputi:

rake db:migrate         # Migrate the database (options: VERSION=x, VERBOSE=false)
rake db:migrate:status  # Display status of migrations
rake db:rollback        # Rolls the schema back to the previous version (specify steps w/ STEP=n)

5
Roll down ke versi tertentu:rake db:migrate VERSION=<version number>
Ajedi32

3
Setidaknya untuk rails 3.0.20, perintah pertama salah. Sebuah rake db:migrate:downkegagalan tunggal dengan pesan kesalahan "VERSION diperlukan". The direkomendasikan rake db:rollback namun bekerja.
martin

Sebagaimana dijelaskan dalam jawaban, Rel 2 HANYA untuk perintah pertama.
Michael Durrant

1
Variabel lingkungan peka huruf besar kecil sehingga harus STEPdanVERSION
Kostas Rousis

Untuk memperjelas, $ rake db:migrate:down VERSION=nnntidak menggulung ke bawah untuk versi, itu bermigrasi ke bawah dengan versi yang ditentukan.
johnml

15

Anda dapat melakukan rollback dan menentukan berapa banyak migrasi terakhir yang akan di-rollback, misalnya

rake db:rollback STEP=3

untuk 3 migrasi terakhir.


ini adalah cara yang lebih cepat dan mudah, daripada mencari nomor versi jika Anda ingin mengurungkan beberapa migrasi terakhir
Pra-alfa

11

Sebagai programmer baru (atau programmer baru lainnya)

rake db:rollbackbekerja sekitar separuh waktu. Saya mulai dari sana.

Jika tidak, rake db:migrate:down VERSION=3846656238

colokkan VERSION untuk nomor versi file migrasi yang ingin Anda kembalikan.


10
rake db:migrate:redo

Ini akan membatalkan dan menerapkan kembali migrasi terakhir.


5

Untuk rel 5 bisa kita gunakan rails command instead of rake

rails db:migrate:down VERSION=<version>

contoh

rails db: migrate: down VERSION = 20170330090327


2

Jalankan perintah ini di terminal Anda:

rake db:migrate:status

atau

bundle exec rake db:migrate:status

Ini menunjukkan status, ID migrasi, nama migrasi untuk semua migrasi yang kami jalankan sebelumnya. pilih id migrasi Anda (yaitu nomor versi Anda) dan masukkan id itu di perintah berikut setelah versi = ,,, dan tekan enter

bundle exec rake db:migrate:down VERSION=

0

Cara mengembalikan migrasi

(1) Pertama Identifikasi ID Migrasi

rake db:migrate:status

  • Salin nomor ID.

Identifikasi migrasi untuk memutar kembali.

(2) Kemudian Kembalikan migrasi

rake db:migrate:down VERSION=20190802023239

  • Tempel nomor ID yang relevan di atas. Tentu saja, dalam kasus Anda, ID migrasi akan berbeda! Gunakan ID migrasi yang benar.

....... dan sekarang Anda berangkat ke balapan!

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.