Saya memiliki file migrasi berikut db\migrate\20100905201547_create_blocks.rb
Bagaimana saya dapat secara khusus mengembalikan file migrasi itu?
Saya memiliki file migrasi berikut db\migrate\20100905201547_create_blocks.rb
Bagaimana saya dapat secara khusus mengembalikan file migrasi itu?
Jawaban:
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:migrate
dan 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
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.
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.
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.
Anda dapat mengembalikan migrasi dengan menggunakan rake db:rollback
berbagai 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 n
jumlah 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.
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/migrate
direktori Anda . Temukan file yang sesuai yang ingin Anda kembalikan dan salin nomor awalannya.
sebagai contoh
nama file: 20140208031131_create_roles.rb
maka versinya adalah20140208031131
rake db:migrate:status
Meluncurkan kembali migrasi terakhir:
# rails < 5.0
rake db:rollback
# rails >= 5.0
rake db:rollback
# or
rails db:rollback
Mengembalikan n
jumlah 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
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
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
Untuk mengembalikan semua migrasi ke versi tertentu (mis. 20181002222222
), Gunakan:
rake db:migrate VERSION=20181002222222
(Perhatikan bahwa ini menggunakan db:migrate
- bukan db:migrate:down
seperti 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:status
awalnya 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
Dari Rails Guide
Anda dapat menggunakan kemampuan Rekaman Aktif untuk mengembalikan migrasi menggunakan revert
metode:
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 revert
Metode 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.
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
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
Class.down
stackoverflow.com/questions/753919/run-a-single-migration-file