Saya mencoba menjalankan hanya satu migrasi dari sejumlah besar di aplikasi rel saya. Bagaimana saya bisa melakukan ini? Saya tidak ingin menjalankan migrasi apa pun sebelum atau sesudahnya. Terima kasih.
Jawaban:
rake db:migrate:redo VERSION=xxxxxxx
, tapi itu akan menjalankan down
dan kemudian up
langkah tersebut. Anda dapat melakukan ini bersama dengan mengomentari langkah turun untuk sementara.
rake -T
.
db:test:prepare
juga tidak muncul di daftar itu. Tuhan, aku terlambat ke pesta.
rake db:migrate:up VERSION=my_version
tidak dapat melakukan apa - apa , karena tabel schema_migrations masih mengatakan bahwa tabel tersebut telah dijalankan. Dalam situasi yang sama rake db:migrate:redo VERSION=my_version
mungkin gagal karena tidak dapat menjatuhkan tabel. Dalam kasus ini, komentari down
metode dalam migrasi untuk sementara dan jalankan kembalirake db:migrate:redo...
rake db:migrate:up VERSION=1234567890
demikian pula rake db:migrate:down
untuk menghapus migrasi tertentu. Anda bisa mendapatkan daftar tugas rake yang tersedia dengan rake -T
.
VERSION
disebutkan di sini adalah nilai integer di awal setiap file migrasi Anda (yang merupakan stempel waktu saat dibuat). Misalnya VERSION=20150720023630
,.
VERSION
ini hanyalah variabel lingkungan sehingga dapat muncul terlebih dahulu dalam perintah atau bahkan diatur sebelumnya ke perintah:VERSION=1234567890 rake db:migrate:up
Saya harus menjalankan satu migrasi yang berubah dan perlu dijalankan kembali secara independen dari semua migrasi lainnya. Jalankan konsol dan lakukan ini:
>> require 'db/migrate/your_migrations.rb'
=> ["YourMigrations"]
>> YourMigrations.up
=> etc... as the migration runs
>> YourMigration.down
Lebih bermanfaat lagi ini bisa dimasukkan ke dalam tugas menyapu dll.
change
, jalankan YourMigrations.migrate(:up)
sebagai gantinya (atau :down
juga!)
require "#{Rails.root}/db/migrate/your_migrations.rb"
rake db:migrate VERSION=20098252345
cobalah itu.
VERSION
hanya variabel lingkungan sehingga dapat muncul terlebih dahulu dalam perintah atau bahkan diatur sebelumnya ke perintah:VERSION=20098252345 rake db:migrate
rake db:migrate:redo version='xxxx'
Ingatlah untuk memberi tanda kutip di sekitar xxxx, xxxx adalah stempel waktu (atau ID Migrasi) untuk migrasi Anda.
Anda dapat memeriksa stempel waktu (ID Migrasi) untuk migrasi sebelumnya yang Anda lakukan dengan menggunakan
rake db:migrate:status
Memperluas jawaban dengan korch di atas, require
tidak berhasil untuk saya, tetapi load
berhasil. Untuk lebih konkretnya, untuk file migrasi:
class ChangeMinQuantityToRaces < ActiveRecord::Migration
def change
change_column :races, :min_quantity, :integer, :default => 0
end
end
di pengetikan konsol
> load 'db/migrate/30130925110821_change_min_quantity_to_races.rb'
> ChangeMinQuantityToRaces.new.change
bekerja untuk saya.
> Race.new.min_quantity # => 0
Ini untuk ruby 1.9.3p484 (revisi 2013-11-22 43786) [x86_64-linux] dan Rails 3.2.13.
Menambahkan 2 ¢ saya ke ini karena saya mengalami masalah yang sama:
Jika Anda benar-benar ingin menjalankan migrasi lagi tanpa membuat yang baru, Anda dapat melakukan hal berikut:
rails dbconsole -p
devdb=# delete from public.schema_migrations where version = '20150105181157';
Dan rel akan "lupa" bahwa ia menjalankan migrasi untuk 20150105181157. Sekarang ketika Anda menjalankan db: migrate, ia akan menjalankannya lagi.
Ini hampir selalu merupakan ide yang buruk. Satu contoh yang masuk akal adalah jika Anda memiliki cabang pengembangan dan Anda belum menyempurnakan migrasi Anda dan ingin menambahkan beberapa hal ke dalamnya dalam pengembangan. Namun meskipun demikian, lebih baik melakukan migrasi 2 arah sehingga Anda dapat melakukan rollback dan coba lagi dengan benar.
Pasti ada cara untuk menjalankan kelas migrasi melalui konsol. Sepertinya saya tidak bisa membuat kode migrasi dikenali.
Namun, seperti yang ditunjukkan oleh komentar, lebih disukai untuk menjalankan migrasi secara berurutan. Menggunakan:
rake db:migrate VERSION=##########
Salin dan tempel kode Anda saat migrasi ke skrip / konsol?
Saya memiliki metode utilitas yang membuatnya sangat mudah dalam pengembangan. Saya menemukan bahwa ini membantu saya menghindari membuat terlalu banyak migrasi - biasanya saya memodifikasi migrasi sampai mereka telah diterapkan.
http://fullware.net/index.php/2011/05/26/easily-load-rails-migrations-for-console-execution/
Saya menggunakan teknik ini dalam pengembangan ketika saya mengubah migrasi dalam jumlah yang signifikan, dan saya tidak ingin bermigrasi sedikit pun dan kehilangan data apa pun di dalamnya (terutama saat saya mengimpor data lama yang membutuhkan waktu lama Saya tidak ingin mengimpor ulang lagi).
Ini 100% hackish dan saya pasti tidak akan merekomendasikan melakukan ini dalam produksi, tetapi itu akan berhasil:
STEP=n
argumen kedb:migrate
(di manan
jumlah migrasi yang akan dijalankan, seperti yang adadb:rollback
) - maka Anda dapat melakukannyarake db:migrate STEP=1
ataurake db:migrate STEP=2
, dll.