Cara menghapus file migrasi di Rails 3


109

Saya ingin menghapus / menghapus file migrasi. Bagaimana saya akan melakukan itu? Saya tahu ada pertanyaan serupa di sini tetapi sebagai pembaruan, apakah ada cara yang lebih baik daripada melakukan skrip / hancurkan?

Selain itu, haruskah saya melakukan db:resetatau db:dropjika saya menghapus / menghapus migrasi?

Jawaban:


142

Saya biasanya:

  1. Lakukan rake db:migrate VERSION=XXXdi semua lingkungan, ke versi sebelum yang ingin saya hapus.
  2. Hapus file migrasi secara manual.
  3. Jika ada migrasi yang tertunda (yaitu, migrasi yang saya hapus bukanlah yang terakhir), saya baru saja melakukan yang baru rake db:migratelagi.

Jika aplikasi Anda sudah dalam produksi atau pementasan, lebih aman untuk hanya menulis migrasi lain yang menghancurkan tabel atau kolom Anda.

Referensi bagus lainnya untuk migrasi adalah: http://guides.rubyonrails.org/migrations.html


2
Akankah menghapus migrasi dan kemudian menjalankan db: migrate menghapus tabel yang telah dibuat?
alvincrespo

2
Tidak, karena Rails tidak tahu cara menghapusnya. Itu perlu memanggil self.downmetode yang ditentukan pada migrasi Anda untuk "menurunkan versi" database Anda.
Fábio Batista

35
Jika Anda sudah menghapus file, tanpa disadari rel tidak akan melepaskannya dengan mudah, rake db:migrate:statusakan menunjukkan ID dari file yang hilang, yang dapat Anda gunakan untuk membuatnya kembali. Setelah itu kembali, Anda dapat mengikuti saran jawaban ini untuk kemenangan.
Jordan Feldstein

1
@JordanFeldstein, terima kasih. db:migrate:statusadalah penyelamat hidup!
dee

1
@Lucas, setelah file migrasi dihapus, itu tidak dapat dikembalikan lagi. Itulah mengapa Anda harus mengembalikannya di semua lingkungan yang telah dijalankannya (produksi, pengembangan, pengujian, pementasan, dll) sebelum menghapus filenya. Itu juga mengapa saya menulis bahwa lebih aman untuk hanya membuat migrasi lain untuk mengembalikan yang lama, setelah itu sudah berjalan dalam produksi.
Fábio Batista

68

Cara lain untuk menghapus migrasi:

$ rails d migration SameMigrationNameAsUsedToGenerate

Gunakan sebelum rake db:migratedijalankan karena perubahan dalam database akan tetap selamanya :) - atau hapus perubahan secara manual


3
"Jika aplikasi Anda sudah dalam produksi atau pementasan, lebih aman untuk hanya menulis migrasi lain yang menghancurkan tabel atau kolom Anda." Jadi perubahan tidak tinggal dalam database selamanya
JohnMerlino

8
Omong-omong, "d" berarti "menghancurkan".
Greg M. Krsak

21

Jalankan di bawah perintah dari direktori home aplikasi:

  1. rake db:migrate:down VERSION="20140311142212" (di sini versi adalah stempel waktu yang diawali dengan rail saat migrasi dibuat. Tindakan ini akan mengembalikan perubahan DB karena migrasi ini)

  2. Run "rails destroy migration migration_name"(nama_migrasi adalah satu-satunya penggunaan yang dipilih saat membuat migrasi. Hapus " timestamp_ " dari nama file migrasi Anda untuk mendapatkannya)


menyapu menghancurkan migrasi menyapu AddFileToTable dibatalkan! Tidak tahu bagaimana membangun tugas 'menghancurkan' (Lihat jejak lengkap dengan menjalankan tugas dengan --trace)
sadaf2605

3
Untuk # 2 perintah yang benar adalah:rails d migration migration_name
mauriciomdea

1
Terima kasih atas petunjuk "hapus timestamp_", itulah yang saya butuhkan
LightMan

10

Anda juga dapat menjalankan migrasi ke bawah seperti:

rake db:migrate:down VERSION=versionnumber

Lihat panduan Ruby on Rails tentang migrasi untuk info lebih lanjut.


9

Kita bisa menggunakan,

$ rails d migration table_name  

Yang akan menghapus migrasi.


1
Saya pikir itu harus menjadi nama model daripada nama_tabel
Ajeet Khan

3

Kadang-kadang saya menemukan diri saya menghapus file migrasi dan kemudian menghapus entri yang sesuai di tabel schema_migrations dari database. Tidak cantik tapi berhasil.


3

Ini juga berfungsi di Rails 5.

Jika migrasi adalah yang terbaru, Anda dapat menghapus kolom database yang ditambahkan oleh migrasi dengan melakukan:

rake db:rollback

kemudian hapus file migrasi itu sendiri dengan menjalankan:

rails d migration WhateverYourMigrationWasNamed.rb 


1

Tak satu pun dari jawaban ini sesuai dengan masalah yang saya alami karena migrasi yang ingin saya hapus tidak ada: Saya telah membuat dan menjalankan migrasi di beberapa cabang lain, yang kemudian dibuang. Masalahnya adalah saat migrasi dijalankan, rails menambahkan versi ke dalam schema_migrationstabel di database. Jadi meskipun tidak terdaftar dalam struktur atau skema db Anda, rel akan mencarinya. Anda dapat mengungkapkan migrasi yatim piatu ini dengan menjalankan:

rails db:migrate:status

Perhatikan versi migrasi yang hilang dan masuk ke konsol db:

rails dbconsole

Sekarang hapus versi dari tabel migrasi secara manual:

delete from schema_migrations where version='<version>';

Anda sekarang harus menjadi baik.


0

Saya baru saja mengalami masalah yang sama:

  1. rel d migrasi fuu -ini menghapus migrasi dengan stempel waktu terakhir
  2. rel d migrasi fuu -ini menghapus migrasi lainnya
  3. gunakan status git untuk memeriksa apakah tidak ada lagi di file yang tidak terlacak
  4. rel g migrasi fuu

Itu memperbaikinya untuk saya


0

Catatan Samping: Mulai dari rel 5.0.0 raketelah diubah menjadirails Jadi lakukan hal berikut

rails db: migrasi VERSION = 0

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.