Kehilangan skema saya.rb! Bisakah itu diregenerasi?


133

Karena beberapa masalah penerapan, saya berhenti melacak schema.rb di git. Entah bagaimana saya telah mengisi ini dan di suatu tempat di sepanjang jalan file schema.rb saya telah menghilang.

Apakah ada cara regenerasi schema.rb dari database atau dari migrasi? Saya lebih suka tidak kehilangan data yang ada.

Jawaban:


230

Jika Anda menjalankannya rake -Takan mencantumkan semua tugas rake yang mungkin untuk proyek Rails Anda. Salah satunya adalah db: schema: dump yang akan membuat ulang schema.rb untuk aplikasi Rails dari database.

bundle exec rake db:schema:dump

Terima kasih banyak, banyak jawaban tetapi sepertinya Anda yang pertama (adil), jadi centang untuk Anda. Hanya ingin tahu, apakah ini menghasilkan skema dari database itu sendiri atau dari migrasi?
brad

7
Dari database itu sendiri, jadi berhati-hatilah jika ada perubahan yang terjadi di luar migrasi.
mguymon

1
schema.rb masih mengandung skema kosong setelah rake db:schema:dumpdi rel 2.0
Will Hardwick-Smith

File schema.rb saya tetap sama persis setelah menjalankan perintah di atas
stevec

59

Cermat,

rake db:schema:dump

akan membuang skema DB saat ini DARI DB . Ini berarti bahwa jika Anda membuat perubahan pada migrasi Anda, mereka TIDAK akan tercermin dalam file schema.rb yang bukan yang Anda inginkan dari IMO.

Jika Anda ingin membuat kembali skema dari migrasi, lakukan hal berikut:

rake db:drop  # ERASES THE DATABASE !!!! 
rake db:create
rake db:migrate

1
Itu akan mengakibatkan hilangnya data, yang menurut OP ingin dihindari. Selain itu, seperti yang ditunjukkan Colin, meregenerasi basis data murni dari migrasi berpotensi merupakan ide yang sangat buruk karena meningkatnya kemungkinan berjalan ke masalah ketergantungan yang ganjil (secara umum). Jika ada migrasi yang tertunda, kemungkinan akan lebih baik untuk menjalankan migrasi terakhir pada mesin pengembangan, dan kemudian jalankan rake db:schema:dumpperintah.
Paul Richter

4
Setiap kanvas dijelaskan dengan jelas dalam jawaban saya. Saya telah digigit PERSIS dengan menjalankan skema saja: dump dan tidak mendapatkan skema bersih. OP berbicara tentang melacak skema di CVS. Saya ingin skema saya selaras dengan definisi saya dalam migrasi saya dan bukan versi usang dari DB produksi atau DB pengembangan lama
gamov

11
rake db:schema:dump

Saya pikir ini masih berlaku di Rails 3 - itu meregenerasi schema.rb dari database.


8

RAILS 5 Way:

rails db:schema:dump

atau jika Anda Encounter Gem :: LoadError lalu:

bundle exec rails db:schema:dump

catatan:

dalam rails 5 direkomendasikan bahwa tugas dibuat / dijalankan dengan menggunakan railsalih-alih rake, ini hanya untuk mengingat, tugas rails dihasilkan dari ekstensi .rakelihat di lib/tasks/myTask.rake. yang berarti tugas ini juga dapat dieksekusi dengan memprioritaskan rake.


5

Jika Anda membuat ulang schema.rbsecara lokal, Anda seharusnya baik-baik saja. Itu hanya memegang representasi dari struktur tabel database Anda. Data itu sendiri tidak terdapat dalam file ini.

Untuk membuat ulang schema.rbfile Anda , jalankan:

bundle exec rake db:schema:dump

Maka cukup komit schema.rbfile baru dan Anda harus dalam kondisi baik!


4

Langsung dari file schema.rb itu sendiri:

Jika Anda perlu membuat database aplikasi pada sistem lain, Anda harus menggunakan db:schema:load, tidak menjalankan semua migrasi dari awal. Yang terakhir adalah pendekatan yang cacat dan tidak berkelanjutan (semakin banyak migrasi yang akan Anda kumpulkan, semakin lambat akan berjalan dan semakin besar kemungkinan masalah).

Jadi JANGAN melakukan saran rake db:migrate, yang disarankan dalam - pada saat penulisan ini - jawaban berperingkat terendah.


Anda mungkin ingin menjalankan beberapa migrasi pending terakhir jika ada pada mesin pengembangan Anda sebelum membuat ulang skema, tapi ya meregenerasi database murni dari migrasi adalah ide yang sangat buruk, terutama karena itu akan mengakibatkan hilangnya data.
Paul Richter

1

Saya juga memiliki masalah serupa di mana skema lama saya tidak menyegarkan bahkan jika saya menghapus migrasi.

Jadi, yang saya lakukan adalah menjatuhkan semua tabel yang ada di database dan memigrasikannya kembali. Kemudian menjalankan perintah "db: schema: load" memberi saya schema.rb baru.

drop table my_table_name // deleted them individually
rake db:migrate
rake db:schema:dump // re-created a new schema
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.