Lakukan hanya satu migrasi

94

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.

Segera
sumber
1
Ini akan menjadi fitur rel yang nyaman: tambahkan STEP=nargumen ke db:migrate(di mana njumlah migrasi yang akan dijalankan, seperti yang ada db:rollback) - maka Anda dapat melakukannya rake db:migrate STEP=1atau rake db:migrate STEP=2, dll.
user664833

Jawaban:

164

rake db:migrate:redo VERSION=xxxxxxx, tapi itu akan menjalankan downdan kemudian uplangkah tersebut. Anda dapat melakukan ini bersama dengan mengomentari langkah turun untuk sementara.

Ryan Bigg
sumber
Hmm, blog.stonean.com/2007/12/18/rake-dbmigrateredo , :: redo sepertinya tidak menggunakan argumen VERSION.
Terry G Lorber
3
@pedrorolo: Ini tidak ketinggalan zaman. Tugas ini tidak memiliki deskripsi sehingga tidak akan muncul di rake -T.
Ryan Bigg
1
@pedrorolo: db:test:preparejuga tidak muncul di daftar itu. Tuhan, aku terlambat ke pesta.
mraaroncruz
9
Untuk memperluas apa yang dikatakan Ryan, jika tabel telah dihapus dari database di luar Rails, rake db:migrate:up VERSION=my_versiontidak 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_versionmungkin gagal karena tidak dapat menjatuhkan tabel. Dalam kasus ini, komentari downmetode dalam migrasi untuk sementara dan jalankan kembalirake db:migrate:redo...
Leo
3
Dan untuk memperluas apa yang dikatakan @Leo, jika migrasi didefinisikan dengan perubahan def, maka ubah ke def self.up sebagai tambahan dari yang di atas.
valk
70
rake db:migrate:up VERSION=1234567890

demikian pula rake db:migrate:downuntuk menghapus migrasi tertentu. Anda bisa mendapatkan daftar tugas rake yang tersedia dengan rake -T.

Shadwell
sumber
4
Yang VERSIONdisebutkan di sini adalah nilai integer di awal setiap file migrasi Anda (yang merupakan stempel waktu saat dibuat). Misalnya VERSION=20150720023630,.
aaron-coding
3
Versi ditampilkan dengan baik dengan rake db: migrate: status
jpgeek
Yang perlu diperhatikan, VERSIONini hanyalah variabel lingkungan sehingga dapat muncul terlebih dahulu dalam perintah atau bahkan diatur sebelumnya ke perintah:VERSION=1234567890 rake db:migrate:up
Joshua Pinter
25

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.


sumber
6
Ini bekerja dengan sangat baik. Anda juga dapat menyalin-tempel kode dari migrasi ke konsol untuk menentukan kelas (dan ini memungkinkan manipulasi manual jika diperlukan, jika Anda membuat kesalahan pada Dev, misalnya). Jika Anda mendefinisikan migrasi yang dapat dibalik dengan change, jalankan YourMigrations.migrate(:up)sebagai gantinya (atau :downjuga!)
trisweb
1
Anda mungkin harusrequire "#{Rails.root}/db/migrate/your_migrations.rb"
s2t2
16

rake db:migrate:up VERSION=version_no

Akan memigrasi (menambah) skrip migrasi tertentu

rake db:migrate:down VERSION=version_no

Akan menghapus skrip migrasi tertentu

reshma
sumber
11
rake db:migrate VERSION=20098252345

cobalah itu.

JP Silvashy
sumber
8
Saya pikir ini akan menjalankan migrasi apa pun hingga yang Anda tentukan.
Ken Liu
1
dekat, tetapi itu juga menjalankan migrasi apa pun sebelum migrasi tertentu.
Anon
6
Saya tidak berpikir Anda harus / ingin menjalankan hanya satu migrasi tanpa mempertimbangkan yang sebelumnya. Migrasi adalah representasi dari struktur database yang berkaitan dengan kode pada titik waktu tertentu, dan dengan demikian migrasi sebelumnya diperlukan. Jika Anda hanya ingin menjalankan satu migrasi, kemungkinan besar Anda tidak menulis operasi naik / turun yang tepat agar migrasi tetap berfungsi ... kebiasaan buruk hanya menulis migrasi Anda.
JP Silvashy
1
Yang perlu diperhatikan: VERSIONhanya variabel lingkungan sehingga dapat muncul terlebih dahulu dalam perintah atau bahkan diatur sebelumnya ke perintah:VERSION=20098252345 rake db:migrate
Joshua Pinter
4
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    
hexinpeter
sumber
3

Memperluas jawaban dengan korch di atas, requiretidak berhasil untuk saya, tetapi loadberhasil. 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.

bhfailor
sumber
2

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.

Ken Simon
sumber
1

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?

Terry G Lorber
sumber
0

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:

  1. Pindahkan migrasi yang ingin Anda jalankan kembali dari direktorinya ke tempat sementara
  2. Hasilkan migrasi lain dengan nama yang sama
  3. Salin / tempel kode migrasi asli ke dalam file migrasi yang baru dibuat
  4. Jalankan migrasi baru
  5. Hapus file migrasi yang baru dibuat
  6. Edit migrasi skema Anda untuk menghapus nilai terbaru
  7. Pulihkan file migrasi lama
Greg Blass
sumber