Pertanyaan yang sangat sederhana di sini - jika migrasi menjadi lambat dan rumit karena suatu aplikasi menjadi lebih kompleks dan jika kita memiliki lebih banyak pembersih rake db:schema:load
untuk dipanggil, mengapa migrasi ada sama sekali?
Jika jawaban di atas adalah bahwa migrasi digunakan untuk kontrol versi (catatan bertahap dari perubahan pada database), maka ketika aplikasi menjadi lebih kompleks dan rake db:schema:load
digunakan lebih banyak, apakah mereka terus mempertahankan fungsi utama mereka?
Peringatan:
Dari jawaban pertanyaan ini: rake db:schema:load
akan menghapus data di server produksi jadi hati-hati saat menggunakannya.
ruby-on-rails
ruby-on-rails-3
migration
sscirrus
sumber
sumber
Jawaban:
Migrasi memberikan perubahan langkah maju dan mundur ke database. Dalam lingkungan produksi, perubahan tambahan harus dilakukan ke basis data selama penyebaran: migrasi menyediakan fungsionalitas ini dengan rollback failafe aman. Jika Anda menjalankan
rake db:schema:load
pada server produksi, Anda akhirnya akan menghapus semua data produksi Anda. Ini adalah kebiasaan yang berbahaya untuk dimasuki.Yang sedang berkata, saya percaya itu adalah praktik yang layak untuk sesekali "runtuh" migrasi. Ini memerlukan penghapusan migrasi lama, menggantinya dengan migrasi tunggal (sangat mirip dengan
schema.rb
file Anda ) dan memperbaruischema_migrations
tabel untuk mencerminkan perubahan ini. Berhati-hatilah saat melakukan ini! Anda dapat dengan mudah menghapus data produksi Anda jika Anda tidak hati-hati.Sebagai catatan, saya sangat percaya bahwa Anda tidak boleh memasukkan pembuatan data dalam file migrasi. The
seed.rb
file dapat digunakan untuk ini, atau kebiasaan menyapu atau menyebarkan tugas. Menempatkan ini ke dalam file migrasi mencampur spesifikasi skema database Anda dengan spesifikasi data Anda dan dapat menyebabkan konflik saat menjalankan file migrasi.sumber
db:schema:load
jika mereka mencoba untukdb:migrate
melawan instalasi baru. @ clear_migrationsBaru saja menemukan posting ini, itu sudah lama sekali dan tidak melihat jawaban yang saya harapkan.
rake db:schema:load
sangat bagus untuk pertama kalinya Anda menempatkan sistem dalam produksi. Setelah itu Anda harus menjalankan migrasi secara normal.Ini juga membantu Anda membersihkan migrasi Anda kapan pun Anda suka, karena skema memiliki semua informasi untuk membuat mesin lain dalam produksi bahkan ketika Anda membersihkan migrasi Anda.
sumber
db:schema:load
selain mencukur beberapa detik satu kali sepanjang siklus pengembangan. Pernahkah Anda bekerja dengan aplikasi yang membutuhkan waktu lebih dari 30 detik untuk dibangun? Saat ini saya sedang mengerjakan sebuah aplikasi yang memiliki bug dalam file migrasi itu dan itu tidak akan pernah bermigrasi tanpa memiliki perbaikan bug atau menjalankandb:schema:load
yang membuat saya berpikir skema: memuat adalah ketika ada sesuatu yang salah mengenai pengembangan aplikasi.instead of editing schema.rb, please use the migrations feature
. Jadi, jika Anda menjalankandb:schema:load
file yang dibuat secara otomatis dan Anda tidak memiliki migrasi untuk membuat-otomatis lagi, Anda secara efektif akan rute "mengedit" skema secara manual dan tidak menggunakan migrasi. Saya berharap saya memiliki kutipan dari panduan rel tentang ini, tetapi mereka tidak membahas skema: memuat, yang menambah rasa frustrasi saya dalam memutuskan bagaimana mendekati skema: memuat fitur. = /rake db:schema:load
sebagai lawanrake db:migrate
. Kemudian dari sana, Anda bisarake db:migrate
.Migrasi memungkinkan Anda menambahkan data ke db juga. tetapi db: skema: memuat hanya memuat skema.
sumber
Karena migrasi dapat dibatalkan, dan menyediakan fungsionalitas tambahan. Misalnya, jika Anda perlu memodifikasi beberapa data sebagai bagian dari perubahan skema maka Anda harus melakukannya sebagai migrasi.
sumber
Sebagai pengguna ORM lain, bagi saya selalu terasa aneh bahwa Rails tidak memiliki fitur 'sinkronisasi dan pembaruan'. yaitu, dengan menggunakan file skema (yang mewakili keseluruhan, skema terbaru), pergi melalui struktur DB yang ada dan tambahkan / hapus tabel, kolom, indeks sesuai kebutuhan.
Bagi saya ini akan jauh lebih kuat, bahkan jika mungkin sedikit lebih lambat.
sumber
schema
adalah master, bukan migrasi.Saya sudah memposting sebagai komentar, tetapi merasa lebih baik meletakkan komentar dari file db / schema.rb di sini:
Sebenarnya, pengalaman saya adalah bahwa lebih baik untuk meletakkan file migrasi di git dan bukan file schema.rb ...
sumber
rake db:migrate
mengatur tabel dalam database. Ketika Anda menjalankan perintah migrasi, ia akan mencari di db / migrate / untuk semua file ruby dan menjalankannya dimulai dengan yang tertua. Ada cap waktu di awal setiap nama file migrasi.Tidak seperti
rake db:migrate
yang menjalankan migrasi yang belum berjalan,rake db:schema:load
memuat skema yang sudah dihasilkandb/schema.rb
ke dalam database.Anda dapat mengetahui lebih lanjut tentang perintah database rake di sini .
sumber