Saya bekerja pada aplikasi rel dengan beberapa cabang git dan banyak dari mereka termasuk migrasi db. Kami mencoba untuk berhati-hati tetapi kadang-kadang beberapa kode master meminta kolom yang dihapus / diganti nama di cabang lain.
Apa yang akan menjadi solusi yang bagus untuk "pasangan" cabang git dengan status DB?
Apa sebenarnya "keadaan" ini?
Kami tidak bisa hanya menggandakan basis data jika ukurannya beberapa GB.
Dan apa yang harus terjadi dengan penggabungan?
Apakah solusinya akan diterjemahkan ke database noSQL juga?
Kami saat ini menggunakan MySQL, mongodb dan redis
EDIT: Sepertinya saya lupa menyebutkan poin yang sangat penting, saya hanya tertarik pada lingkungan pengembangan tetapi dengan database besar (ukuran beberapa GB).
ruby-on-rails
database
git
Kostas
sumber
sumber
Jawaban:
Saat Anda menambahkan migrasi baru di cabang apa pun, jalankan
rake db:migrate
dan lakukan migrasi dandb/schema.rb
Jika Anda melakukan ini, dalam pengembangan, Anda akan dapat beralih ke cabang lain yang memiliki kumpulan migrasi berbeda dan cukup dijalankan
rake db:schema:load
.Perhatikan bahwa ini akan membuat ulang seluruh database, dan data yang ada akan hilang .
Anda mungkin hanya ingin menjalankan produksi dari satu cabang yang sangat hati-hati, sehingga langkah-langkah ini tidak berlaku di sana (jalankan
rake db:migrate
seperti biasa di sana). Namun dalam pengembangan, seharusnya bukan masalah besar untuk membuat ulang database dari skema, yangrake db:schema:load
akan dilakukan.sumber
db/seeds.rb
itu seharusnya tidak terlalu merusak untuk membatalkan pengembangan DB Anda jika Anda menyiapkan beberapa data benih yang masuk akal di sana.db/seeds.rb
untuk melakukan ripopulasi data db yang hilangJika Anda memiliki database besar yang tidak dapat dengan mudah direproduksi, maka saya akan merekomendasikan menggunakan alat migrasi normal. Jika Anda menginginkan proses yang sederhana, inilah yang saya rekomendasikan:
rake db:rollback
) ke status sebelum titik cabang. Kemudian, setelah berganti cabang, jalankandb:migrate
. Ini benar secara matematis, dan selama Anda menulisdown
skrip, itu akan berhasil.sumber
rake db:schema:load
danrake db:seed
seperti yang dikatakan @noodl.Berikut ini skrip yang saya tulis untuk beralih antar cabang yang berisi migrasi berbeda:
https://gist.github.com/4076864
Itu tidak akan menyelesaikan semua masalah yang Anda sebutkan, tetapi diberi nama cabang itu akan:
Saya menemukan diri saya secara manual melakukan ini sepanjang waktu di proyek kami, jadi saya pikir akan menyenangkan untuk mengotomatiskan prosesnya.
sumber
git checkout db/schema.rb
atau maksud Andagit checkout -- db/schema.rb
? (Yaitu dengan tanda hubung ganda)db/schema.rb
. :)Pisahkan Database untuk setiap Cabang
Ini satu-satunya cara untuk terbang.
Perbarui 16 Oktober 2017
Saya kembali ke ini setelah beberapa waktu dan melakukan beberapa perbaikan:
bundle exec rake git:branch
.db:clone_from_branch
tugas yang diambilSOURCE_BRANCH
danTARGET_BRANCH
variabel lingkungan. Saat menggunakannyagit:branch
akan secara otomatis menggunakan cabang saat ini sebagaiSOURCE_BRANCH
.config/database.yml
Dan untuk membuatnya lebih mudah bagi Anda, inilah cara Anda memperbarui
database.yml
file Anda untuk secara dinamis menentukan nama basis data berdasarkan cabang saat ini.lib/tasks/db.rake
Inilah tugas Rake untuk mengkloning basis data Anda dari satu cabang ke cabang lainnya dengan mudah. Ini membutuhkan variabel a
SOURCE_BRANCH
danTARGET_BRANCH
lingkungan. Didasarkan dari tugas @spalladino .lib/tasks/git.rake
Tugas ini akan membuat cabang git dari cabang saat ini (master, atau lainnya), memeriksanya dan mengkloning basis data cabang saat ini ke dalam basis data cabang baru. Ini AF yang apik.
Sekarang, yang perlu Anda lakukan adalah menjalankan
bundle exec git:branch
, masukkan nama cabang baru dan mulai membunuh zombie.sumber
Mungkin Anda harus menganggap ini sebagai petunjuk bahwa database pengembangan Anda terlalu besar? Jika Anda bisa menggunakan db / seeds.rb dan kumpulan data yang lebih kecil untuk pengembangan maka masalah Anda dapat dengan mudah diselesaikan dengan menggunakan schema.rb dan seeds.rb dari cabang saat ini.
Itu mengasumsikan bahwa pertanyaan Anda berkaitan dengan pengembangan; Saya tidak bisa membayangkan mengapa Anda harus secara teratur berganti cabang dalam produksi.
sumber
db/seeds.rb
, saya akan memeriksanya.Saya berjuang dengan masalah yang sama. Ini solusinya:
Pastikan bahwa schema.rb dan semua migrasi diperiksa oleh semua pengembang.
Harus ada satu orang / mesin untuk penyebaran ke produksi. Sebut mesin ini sebagai mesin gabungan. Ketika perubahan ditarik ke mesin gabungan, gabungan otomatis untuk schema.rb akan gagal. Tidak ada masalah. Ganti saja konten dengan konten apa pun yang sebelumnya untuk schema.rb (Anda dapat menyisihkan salinannya atau mendapatkannya dari github jika Anda menggunakannya ...).
Inilah langkah penting. Migrasi dari semua pengembang sekarang akan tersedia di folder db / bermigrasi. Maju dan jalankan bundle exec rake db: migrate. Ini akan membawa database pada mesin gabungan sejajar dengan semua perubahan. Ini juga akan membuat ulang schema.rb.
Komit dan dorong perubahan ke semua repositori (remote dan individu, yang juga remote). Anda harus selesai!
sumber
Inilah yang telah saya lakukan dan saya tidak yakin bahwa saya telah membahas semua pangkalan:
Dalam pengembangan (menggunakan postgresql):
Ini jauh lebih cepat daripada utilitas rake pada database dengan sekitar 50 ribu catatan.
Untuk produksi, pertahankan cabang master sebagai sakral dan semua migrasi diperiksa, shema.rb digabung dengan benar. Ikuti prosedur peningkatan standar Anda.
sumber
Anda ingin melestarikan "lingkungan db" per cabang. Lihatlah skrip smudge / clean untuk menunjuk ke instance yang berbeda. Jika Anda kehabisan instance db, minta skrip memutar instance temp sehingga ketika Anda beralih ke cabang baru, itu sudah ada di sana dan hanya perlu diganti namanya dengan skrip. Pembaruan DB harus dijalankan sebelum Anda menjalankan tes.
Semoga ini membantu.
sumber
Saya benar-benar mengalami pita yang Anda miliki di sini. Ketika saya memikirkannya, masalah sebenarnya adalah bahwa semua cabang tidak memiliki kode untuk mengembalikan cabang tertentu. Saya di dunia Django, jadi saya tidak tahu menyapu dengan baik. Saya mempermainkan ide bahwa migrasi hidup dalam repo mereka sendiri yang tidak bercabang (git-submodule, yang baru-baru ini saya pelajari). Dengan begitu semua cabang memiliki semua migrasi. Bagian lengket memastikan setiap cabang dibatasi hanya untuk migrasi yang mereka pedulikan. Melakukan / mencatat itu secara manual akan menjadi pita dan cenderung kesalahan. Tetapi tidak ada alat migrasi yang dibangun untuk ini. Itulah titik di mana saya tanpa jalan ke depan.
sumber
Saya akan menyarankan satu dari dua opsi:
Pilihan 1
seeds.rb
. Pilihan yang bagus adalah membuat data seed Anda melalui permata FactoryGirl / Fabrikasi. Dengan cara ini Anda dapat menjamin bahwa data sinkron dengan kode jika kami menganggap, bahwa pabrik diperbarui bersama dengan penambahan / penghapusan kolom.rake db:reset
, yang secara efektif menjatuhkan / membuat / menambakan basis data.pilihan 2
Secara manual menjaga status database dengan selalu menjalankan
rake db:rollback
/rake db:migrate
sebelum / setelah checkout cabang. Peringatannya adalah bahwa semua migrasi Anda harus dapat dibalik, jika tidak ini tidak akan berhasil.sumber
Tentang lingkungan pengembangan:
Anda harus bekerja dengan
rake db:migrate:redo
untuk menguji apakah skrip Anda dapat dibalik, tetapi perlu diingat selalu harusseed.rb
dengan populasi data.Jika Anda bekerja dengan git, Anda seed.rb harus diubah dengan perubahan migrasi, dan eksekusi
db:migrate:redo
untuk permulaan (memuat data untuk pengembangan baru di komputer lain atau database baru)Terlepas dari "perubahan", dengan metode Anda atas dan ke bawah, kode Anda selalu menjadi skenario untuk "perubahan" pada saat ini dan kapan mulai dari nol.
sumber