Projemi başlatmaya hazırım. Lansmandan sonra büyük planlarım var ve veritabanı yapısı değişecek - mevcut tablolardaki yeni sütunların yanı sıra yeni tablolar ve mevcut ve yeni modellerle yeni ilişkilendirmeler.
Ben sadece veritabanı her değiştiğinde silmeyi umursamadım test verileri vardı, Sequelize henüz taşıma dokunmadı.
Bu amaçla, sync force: true
model tanımlarını değiştirdiysem şu anda uygulamam başlatıldığında çalışıyorum . Bu, tüm tabloları siler ve sıfırdan yapar. force
Sadece yeni tablolar oluşturma seçeneğini atlayabilirim . Ancak mevcut olanlar değiştiyse, bu yararlı değildir.
Göçleri eklediğimde işler nasıl çalışır? Açıkçası ben mevcut tablolar (içinde veri ile) silinmesini istemiyorum, bu yüzden sync force: true
söz konusu. Uygulamanın dağıtım prosedürünün bir parçası olarak geliştirilmesine yardımcı olduğum diğer uygulamalarda (Laravel ve diğer çerçeveler) bekleyen taşıma işlemlerini çalıştırmak için taşıma komutunu çalıştırıyoruz. Ancak bu uygulamalarda ilk geçişin, iskelet veritabanına sahip olması, veritabanının geliştirilmesinde bir süre önce olduğu durumdaydı - ilk alfa sürümü veya başka bir şey. Böylece, partiye geç uygulamanın bir örneği bile, tüm geçişleri sırayla çalıştırarak tek seferde hız kazanabilir.
Sequelize'de böyle bir "ilk göçü" nasıl oluştururum? Eğer bir tane yoksa, uygulamanın bir şekilde yeni bir örneği, geçişleri çalıştırmak için iskelet veritabanı içermez veya başlangıçta senkronizasyonu çalıştırır ve veritabanını tümüyle yeni duruma getirir yeni tablolar vb., ancak daha sonra taşıma işlemlerini gerçekleştirmeye çalıştıklarında, orijinal veritabanı ve birbirini izleyen her yinelemeyi akıllarında bulundukları için mantıklı olmazlar.
Düşünme sürecim: her aşamada, ilk veritabanı artı sırayla yapılan her geçiş, aşağıdaki durumlarda oluşturulan veritabanına eşit olmalıdır (artı veya eksi veri) sync force: true
çalıştırılır. Bunun nedeni koddaki model açıklamalarının veritabanı yapısını tanımlamasıdır. Bu nedenle, belki de bir geçiş tablosu yoksa, senkronize olmayız ve çalıştırılmasalar bile tüm taşıma işlemlerini tamamlanmış olarak işaretleriz. Yapmam gereken bu mu (nasıl?), Ya da Sequelize'in bunu kendisi yapması mı gerekiyor, yoksa yanlış ağacı havlıyor muyum? Ve eğer doğru alandaysam, eski modeller göz önüne alındığında, bir göçün çoğunu otomatik olarak oluşturmanın güzel bir yolu olmalı (taahhüt karma ile? Hatta her göç bir taahhüde bağlı olabilir mi? taşınabilir olmayan git merkezli bir evrende) ve yeni modeller. Yapıyı farklılaştırabilir ve veritabanını eskiden yeniye ve geriye dönüştürmek için gerekli komutları üretebilir ve daha sonra geliştirici içeri girebilir ve gerekli değişiklikleri yapabilir (belirli verileri silme / geçiş vb.).
Ben --init
komut ile sequelize ikili çalıştırdığınızda bana boş bir göç dizini verir. Sonra çalıştırdığımda sequelize --migrate
bana hiçbir şey, başka bir tablo ile bir SequelizeMeta tablo yapar. Açıkçası değil, çünkü bu ikili benim app bootstrap ve modelleri yüklemek için nasıl bilmiyor.
Bir şey eksik olmalıyım.
TLDR: Uygulamamı ve geçişlerini, canlı uygulamanın çeşitli örneklerinin yanı sıra eski başlangıç veritabanı olmayan yepyeni bir uygulamanın güncellenebilmesi için nasıl ayarlayabilirim?
sync
, fikir, geçişlerin tüm veritabanını "oluşturduğu" için bir iskelete güvenmek kendi başına bir problemdir. Örneğin Ruby on Rails iş akışı, her şey için Geçişler kullanır ve buna alıştığınızda oldukça harika. Edit: Ve evet, bu sorunun oldukça eski olduğunu fark ettim, ama hiç tatmin edici bir cevap olmamış gibi görmek ve insanlar buraya rehberlik arıyor gelebilir, ben katkıda gerektiğini düşündüm.