Apakah ada cara mudah untuk menjalankan satu migrasi? Saya tidak ingin bermigrasi ke versi tertentu, saya hanya ingin menjalankan yang spesifik.
267
Apakah ada cara mudah untuk menjalankan satu migrasi? Saya tidak ingin bermigrasi ke versi tertentu, saya hanya ingin menjalankan yang spesifik.
Jawaban:
Anda bisa menjalankan kode langsung dari file ruby:
Catatan: versi rel yang lebih baru mungkin membutuhkan
AddFoos.new.up
daripadaAddFoos.up
.Cara alternatif (tanpa IRB) yang bergantung pada fakta yang membutuhkan pengembalian array nama kelas:
Perhatikan bahwa jika Anda melakukan ini, itu mungkin tidak akan memperbarui
schema_migrations
tabel, tetapi sepertinya itulah yang Anda inginkan.sumber
AddFoos.new.up
require "./db/migrate/db/migrate/20090408054532_add_foos.rb"
thenAddFoos.new.up
change
alih-alihup
dandown
, Anda harus menjalankanAddFoos.new.migrate(:up)
AddFoos.new.change
Dengan asumsi Rails versi terbaru Anda selalu dapat menjalankan:
Di mana versi adalah cap waktu dalam nama file migrasi.
Sunting: Di beberapa titik selama 8 tahun terakhir (saya tidak yakin versi apa) Rail menambahkan cek yang mencegah ini berjalan jika sudah dijalankan. Ini ditunjukkan oleh entri dalam
schema_migrations
tabel. Untuk menjalankannya kembali, jalankanrake db:migrate:redo VERSION=20090408054532
saja.sumber
rake db:migrate:down VERSION=XXX
Jika Anda ingin menjalankan migrasi tertentu , lakukan
Jika Anda ingin menjalankan migrasi beberapa kali , lakukan
Jika Anda ingin menjalankan satu migrasi beberapa kali, lakukan
(Anda dapat menemukan nomor versi di nama file migrasi Anda)
Sunting: Anda juga dapat dengan mudah mengganti nama file migrasi Anda, Misalnya:
20151013131830_my_migration.rb
->20151013131831_my_migration.rb
Kemudian bermigrasi secara normal, ini akan memperlakukan migrasi sebagai yang baru (berguna jika Anda ingin bermigrasi di lingkungan yang jauh (seperti pementasan) di mana Anda memiliki kontrol lebih sedikit.
Sunting 2 : Anda juga bisa hanya mem-nuke entri migrasi dalam database. Misalnya:
rake db:migrate
kemudian akan menjalankan kembaliup
metode migrasi nuked.sumber
Jika Anda telah menerapkan
change
metode seperti ini:Anda dapat membuat instance migrasi dan menjalankan
migrate(:up)
ataumigrate(:down)
pada instance, seperti ini:sumber
up
dandown
.Ini adalah langkah-langkah untuk menjalankan lagi file migrasi ini "20150927161307_create_users.rb"
Salin dan lewati kelas yang ada di file itu ke konsol.
Buat instance kelas
CreateUsers
:c1 = CreateUsers.new
change
instance itu:c1.change
sumber
require "./db/migrate/20150927161307_create_users.rb"
alih-alih menyalin & menempel. Anda kemudian dapat menjalankan kelas dengan cara yang sama dengan membuat instance dan memanggil metode yang didefinisikan dalam kelasCreateUsers.new.change
.Sampai
rails 5
Anda juga dapat menggunakanrails
bukannyarake
Rel 3 - 4
Rel 5
sumber
rails db:migrate VERSION=20160920130051
Jika Anda memiliki masalah dengan jalur yang bisa Anda gunakan
sumber
Metode 1:
Metode 2:
Di Rails Console 1. Salin tempelkan kelas migrasi di konsol (mis. Add_name_to_user.rb) 2. Kemudian di konsol, ketikkan yang berikut ini
Sudah selesai !!
sumber
Harap perhatikan bahwa alih-alih
script/runner
, Anda mungkin harus menggunakanrails runner
pada lingkungan rel baru.sumber
Jika Anda ingin menjalankannya dari konsol, inilah yang Anda cari:
Saya mencoba jawaban lain, tetapi membutuhkan tanpa
Rails.root
tidak berhasil untuk saya.Selain itu,
.migrate(:up)
sebagian memaksa migrasi untuk menjalankan ulang terlepas dari apakah sudah berjalan atau belum. Ini berguna untuk ketika Anda sudah menjalankan migrasi, harus membatalkannya dengan bermain-main dengan db dan ingin solusi cepat untuk mendapatkannya kembali.sumber
Sepertinya setidaknya dalam rilis Rails terbaru (5.2 pada saat penulisan) ada satu lagi cara memfilter migrasi yang sedang dijalankan. Seseorang dapat melewati filter dalam
SCOPE
variabel lingkungan yang kemudian akan digunakan untuk memilih file migrasi.Dengan asumsi Anda memiliki dua file migrasi
1_add_foos.rb
dan2_add_foos.run_this_one.rb
berjalanakan memilih dan menjalankan saja
2_add_foos.run_this_one.rb
. Perlu diingat bahwa semua file migrasi yang sesuai dengan cakupan akan dijalankan.sumber