Saya hampir memiliki proyek saya siap diluncurkan. Saya punya rencana besar setelah peluncuran dan struktur database akan berubah - kolom baru di tabel yang ada serta tabel baru, dan asosiasi baru ke model yang ada dan model baru.
Saya belum menyentuh migrasi di Sequelize, karena saya hanya memiliki data pengujian yang tidak keberatan saya hapus setiap kali database berubah.
Untuk itu, saat ini saya menjalankan sync force: true
aplikasi saya saat dijalankan, jika saya telah mengubah definisi model. Ini menghapus semua tabel dan membuatnya dari awal. Saya dapat menghilangkan force
opsi untuk membuatnya hanya membuat tabel baru. Tetapi jika sudah ada yang berubah hal ini tidak berguna.
Jadi, begitu saya menambahkan migrasi, bagaimana cara kerjanya? Jelas saya tidak ingin tabel yang ada (dengan data di dalamnya) dihapus, jadi sync force: true
itu tidak mungkin. Pada aplikasi lain yang saya bantu kembangkan (Laravel dan kerangka kerja lainnya) sebagai bagian dari prosedur penerapan aplikasi, kami menjalankan perintah migrasi untuk menjalankan migrasi yang tertunda. Namun dalam aplikasi ini, migrasi pertama memiliki basis data kerangka, dengan basis data dalam keadaan di mana pada beberapa waktu awal pengembangan - rilis alfa pertama atau apa pun. Jadi, bahkan instance aplikasi yang terlambat ke pesta bisa mendapatkan kecepatan sekaligus, dengan menjalankan semua migrasi secara berurutan.
Bagaimana cara menghasilkan "migrasi pertama" seperti itu di Sequelize? Jika saya tidak memilikinya, instance baru dari aplikasi entah bagaimana nantinya tidak akan memiliki database kerangka untuk menjalankan migrasi, atau akan menjalankan sinkronisasi di awal dan akan membuat database dalam status baru dengan semua tabel baru dll, tetapi kemudian ketika mencoba untuk menjalankan migrasi mereka tidak masuk akal, karena mereka ditulis dengan database asli dan setiap iterasi berturut-turut dalam pikiran.
Proses pemikiran saya: pada setiap tahap, database awal ditambah setiap migrasi secara berurutan harus sama (plus atau minus data) database yang dihasilkan ketika sync force: true
dijalankan. Ini karena deskripsi model dalam kode menggambarkan struktur database. Jadi mungkin jika tidak ada tabel migrasi kita hanya menjalankan sinkronisasi dan menandai semua migrasi sebagai selesai, meskipun mereka tidak berjalan. Apakah ini yang perlu saya lakukan (bagaimana?), Atau Sequelize seharusnya melakukan ini sendiri, atau apakah saya menggonggong pohon yang salah? Dan jika saya berada di area yang tepat, tentunya seharusnya ada cara yang bagus untuk menghasilkan sebagian besar migrasi secara otomatis, mengingat model lama (dengan melakukan hash? Atau bahkan setiap migrasi dapat dikaitkan dengan komit? Saya akui, saya sedang berpikir dalam dunia git-sentris non-portabel) dan model baru. Ini dapat membedakan struktur dan menghasilkan perintah yang diperlukan untuk mengubah database dari lama ke baru, dan kembali, dan kemudian pengembang dapat masuk dan membuat perubahan yang diperlukan (menghapus / mentransisikan data tertentu dll).
Ketika saya menjalankan sekuel biner dengan --init
perintah itu memberi saya direktori migrasi kosong. Ketika saya kemudian menjalankannya, sequelize --migrate
itu membuat saya menjadi tabel SequelizeMeta tanpa apa pun di dalamnya, tidak ada tabel lain. Jelas tidak, karena biner itu tidak tahu cara mem-bootstrap aplikasi saya dan memuat model.
Saya pasti melewatkan sesuatu.
TLDR: bagaimana cara menyiapkan aplikasi saya dan migrasinya sehingga berbagai contoh aplikasi langsung dapat diperbarui, serta aplikasi baru tanpa database awal yang lama?
sync
untuk saat ini, idenya adalah bahwa migrasi "menghasilkan" seluruh database, jadi mengandalkan kerangka itu sendiri merupakan masalah. Alur kerja Ruby on Rails, misalnya, menggunakan Migrasi untuk semuanya, dan ini cukup mengagumkan setelah Anda terbiasa. Sunting: Dan ya, saya perhatikan pertanyaan ini cukup lama, tetapi karena belum pernah ada jawaban yang memuaskan dan orang-orang mungkin datang ke sini untuk mencari panduan, saya pikir saya harus berkontribusi.