Apakah ada cara mudah untuk menjalankan satu migrasi? Saya tidak ingin bermigrasi ke versi tertentu, saya hanya ingin menjalankan yang spesifik.
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:
rails console
>> require "db/migrate/20090408054532_add_foos.rb"
>> AddFoos.up
Catatan: versi rel yang lebih baru mungkin membutuhkan AddFoos.new.up
daripada AddFoos.up
.
Cara alternatif (tanpa IRB) yang bergantung pada fakta yang membutuhkan pengembalian array nama kelas:
script/runner 'require("db/migrate/20090408054532_add_foos.rb").first.constantize.up'
Perhatikan bahwa jika Anda melakukan ini, itu mungkin tidak akan memperbarui schema_migrations
tabel, tetapi sepertinya itulah yang Anda inginkan.
AddFoos.new.up
require "./db/migrate/db/migrate/20090408054532_add_foos.rb"
thenAddFoos.new.up
change
alih-alih up
dan down
, Anda harus menjalankanAddFoos.new.migrate(:up)
AddFoos.new.change
Dengan asumsi Rails versi terbaru Anda selalu dapat menjalankan:
rake db:migrate:up VERSION=20090408054532
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, jalankan rake db:migrate:redo VERSION=20090408054532
saja.
rake db:migrate:down VERSION=XXX
Jika Anda ingin menjalankan migrasi tertentu , lakukan
$ rake db:migrate:up VERSION=20080906120000
Jika Anda ingin menjalankan migrasi beberapa kali , lakukan
# use the STEP parameter if you need to go more than one version back
$ rake db:migrate:redo STEP=3
Jika Anda ingin menjalankan satu migrasi beberapa kali, lakukan
# this is super useful
$ rake db:migrate:redo VERSION=20080906120000
(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:
rails_c> q = "delete from schema_migrations where version = '20151013131830'"
rails_c> ActiveRecord::Base.connection.execute(q)
rake db:migrate
kemudian akan menjalankan kembali up
metode migrasi nuked.
Jika Anda telah menerapkan change
metode seperti ini:
class AddPartNumberToProducts < ActiveRecord::Migration
def change
add_column :products, :part_number, :string
end
end
Anda dapat membuat instance migrasi dan menjalankan migrate(:up)
atau migrate(:down)
pada instance, seperti ini:
$ rails console
>> require "db/migrate/20090408054532_add_part_number_to_products.rb"
>> AddPartNumberToProducts.new.migrate(:down)
up
dan down
.
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.
class CreateUsers < ActiveRecord::Migration
def change
create_table :users do |t|
t.string :name
t.string :email
t.timestamps null: false end
end
end
end
Buat instance kelas CreateUsers
:c1 = CreateUsers.new
change
instance itu:c1.change
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 kelas CreateUsers.new.change
.
Sampai rails 5
Anda juga dapat menggunakan rails
bukannyarake
Rel 3 - 4
# < rails-5.0
rake db:migrate:up VERSION=20160920130051
Rel 5
# >= rails-5.0
rake db:migrate:up VERSION=20160920130051
# or
rails db:migrate:up VERSION=20160920130051
rails db:migrate VERSION=20160920130051
Jika Anda memiliki masalah dengan jalur yang bisa Anda gunakan
require Rails.root + 'db/migrate/20090408054532_add_foos.rb'
Harap perhatikan bahwa alih-alih script/runner
, Anda mungkin harus menggunakan rails runner
pada lingkungan rel baru.
Jika Anda ingin menjalankannya dari konsol, inilah yang Anda cari:
$ rails console
irb(main)> require "#{Rails.root.to_s}/db/migrate/XXXXX_my_migration.rb"
irb(main)> AddFoo.migrate(:up)
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.
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
dan 2_add_foos.run_this_one.rb
berjalan
SCOPE=run_this_one rails db:migrate:up
akan memilih dan menjalankan saja 2_add_foos.run_this_one.rb
. Perlu diingat bahwa semua file migrasi yang sesuai dengan cakupan akan dijalankan.