- SQL şemaları arasındaki farkı (diff) karşılaştırarak veritabanı migrasyonlarını yöneten CLI tabanlı araç
- Yaygın SQL DDL sözdizimini kullanarak RDBMS şemaları yönetilebilir
- MySQL, MariaDB, TiDB, PostgreSQL, SQL Server, SQLite3 gibi başlıca veritabanlarını destekler
- Web sitesinde, WebAssembly build kullanan çevrim içi demo ile şema karşılaştırma ve DDL üretim işlevleri denenebilir
- Veritabanı değişiklikleri idempotent olarak yönetilebilir; bu da kararlı şema senkronizasyonu için kullanışlıdır
sqldef genel bakış
- sqldef, iki SQL şemasını karşılaştırıp (diff) farkları analiz eden ve buna dayanarak DDL komutları üreten bir CLI aracıdır
- Kullanıcılar mevcut şema ile hedef şemayı karşılaştırarak gerekli değişiklikleri otomatik olarak çıkarabilir
- Migrasyonlar, yaygın SQL DDL ifadeleri doğrudan kullanılarak gerçekleştirilebilir
- Desteklenen veritabanları olarak MySQL, MariaDB, TiDB, PostgreSQL, SQL Server, SQLite3 belirtilir
Çevrim içi demo özellikleri
- Web sitesinde, şema değişikliklerini görsel olarak incelemeyi sağlayan bir Online Demo sunulur
- “Enable DROP” seçeneğiyle silme komutlarının dahil edilip edilmeyeceği kontrol edilebilir
- “Up (current → desired)” bölümünde yeni sütun ekleme, indeks oluşturma, kısıt ekleme gibi örnek DDL'ler gösterilir
- “Down (desired → current)” bölümünde kısıt kaldırma gibi ters yöndeki değişiklik örnekleri sunulur
Çalışma şekli
- Çevrim içi demo, tarayıcı içinde SQL şema karşılaştırması (diff) yapmak için sqldef'in WebAssembly build sürümünü kullanır
- İki şema arasındaki farkı hesaplar ve bunun sonucunda gerekli DDL komutlarını otomatik olarak üretir
- GitHub depo bağlantısı üzerinden WebAssembly build kaynağı incelenebilir
1 yorum
Hacker News yorumları
Postgres için daha kapsamlı bir kapsama istiyorsanız, benim yaptığım pgschema'ya bakmaya değer
Geçen yaz epey tamamlandığını düşünmüştüm ama 6 ay boyunca kullanıcıların bildirdiği 100'den fazla sorunu çözerken ne kadar saf olduğumu fark ettim
Birden fazla veritabanı kümesinde tutarsızlıkları denetleme desteği olup olmadığını merak ediyorum
SQLite ile denedim ama mevcut tabloya foreign key constraint eklemek gibi zor migration'larda geçersiz SQL üretiyor
Örneğin
ALTER TABLE books ADD CONSTRAINT fk_books_author FOREIGN KEY (author_id) REFERENCES authors (id)gibi bir ifade SQLite'ta geçerli değilİlgili dokümantasyon için SQLite ALTER TABLE
Ben Atlas'ı kullanıyorum
Migration tabanlı ve şema tabanlı yaklaşımların ikisinin de artıları ve eksileri var, bu yüzden tek bir projede iki yöntemi birlikte kullanıyorum
Şema tabanlı yaklaşım geliştirme hızını artırıyor, migration tabanlı yaklaşım ise daha güven veren deploy imkânı sunuyor
Atlas PR içinde migration'ları otomatik ürettiği için çoğu geliştirici versiyonlu workflow ile doğrudan uğraşmıyor
İlgili dokümanlar: Declarative vs Versioned Workflows, Atlas Action
Açıkça tanımlanmış migration flow desteği hoşuma gitti. Gerçek deploy öncesinde tam olarak hangi değişikliklerin uygulanacağını bilmek istiyorum
Arka plan migration'larını destekleyen iyi bir araç olup olmadığını merak ediyorum
Örneğin büyük bir tabloya geçici nullable bir kolon ekleyip, yeni kodun o kolona veri yazmaya başlamasından sonra arka planda mevcut veriyi batch'lerle doldurup en sonunda kolonu non-nullable yapmak gibi bir iş akışı
Böyle prosedürel değişiklikleri deklaratif biçimde ifade edip kodla birlikte inceleyip test edebileceğimiz bir araç olsa iyi olurdu
Şu anda bunu çoğunlukla geçici script'ler ve manuel deploy talimatlarıyla yapıyoruz
Geliştirme ortamında kurulumu kolay ve FastEndpoints-SqlJobQueues gibi örnekleri var
Bu araç gerçekten harika
Sayesinde aynı şeyi yapmaya çalıştığım hobi projemi bırakabileceğim
Onun yerine zaten 100 kez çözülmüş başka bir problemi ele alan yeni bir projeye başlayacağım — örneğin systemd loglarını izleyip hata olunca e-posta gönderen basit bir araç gibi
Bir başka migration manager değil de küçük ve kullanışlı bir araç olması hoşuma gitti
SQL'in zayıf yönlerini güzelce tamamlıyor gibi. Keşke Spanner DDL gibi deklaratif olsaydı diye düşündürüyor
Postgres'te şema script'lerini idempotent tutmaya çalışıyorum.
CREATE TABLE IF NOT EXISTSile başlıyor, yeni kolon eklerkenALTERifadelerini ayrı tutuyorumAma zamanla script'ler karmaşıklaşıyor ve işler oturunca ALTER ifadelerini temizliyorum
Eğer eski bir yedeği geri yüklemek gerekirse, böyle bir araç uyumluluğu hızlıca yakalamaya yardımcı olabilir gibi görünüyor
Entity Framework veya sqitch/liquibase ile karşılaştırınca nasıl olduğunu merak ediyorum
Deklaratif yaklaşımı anlıyorum ama büyük prodüksiyon veritabanlarında migration'lar sadece deklaratif olmuyor
İdeal bir şema yöneticisinin sorgu maliyeti ve kesinti süresini en aza indirme stratejilerini anlaması gerekir
Kolon eklemek veya indeks değiştirmek tüm tablo taramasına yol açabilir
Örneğin Fullname alanını FirstName ve LastName olarak ayırırsanız, basit bir diff bunun ancak yarısını ifade eder
EF Core'da geri alınabilir dönüşümler Up/Down metotlarıyla ele alınıyor
Böyle bir kavram olmadan veri dönüşümlerinin nasıl yönetildiğini merak ediyorum
Biz şirket içinde XML tabanlı kendi dönüşüm aracımızı yaptık
XML, SQL'e göre parse etmesi daha kolay olduğu için XML'de tanımlanan şemayla veritabanını karşılaştırıp sadece gerekli değişiklikleri uyguluyoruz
Sybase SQLAnywhere kullanıyorduk ve materialized view işin içindeyken kolon ekleme/silmede view'ları ve indeksleri yeniden oluşturma karmaşıklığı vardı
Bu yüzden güvenlik önlemleri ekledik; kolon silmeye yalnızca açıkça belirtildiğinde izin veriyoruz, tip değişikliklerini de sadece güvenli durumlarda yapıyoruz
Yüzlerce on-premise kurulum ortamında migration'ları çok basit hale getiriyor
Sadece XML'i değiştiriyorsunuz, araç geri kalanını hallediyor ve gerektiğinde yeni özellik ekleyebiliyorsunuz
SQLite'ta kolon silme konusu iyi işlemiyor
Son sürümlerde DROP COLUMN eklendi ama çoğu cihazda hâlâ desteklenmiyor
Örnekte
x integer not nullekleyip DROP denendiğinde sadece “-- Skipped” mesajı çıkıyorStandart yöntem geçici tablo oluşturup veriyi kopyaladıktan sonra değiştirmek ama bu araç bunu otomatikleştirmiyor
Constraint'ler devreye girdiğinde hata yapması kolay bir alan olduğu için bu biraz hayal kırıklığı yaratıyor
Sonuçta sadece kolay işleri yapacaksa bunu elle yapmak daha mantıklı gibi geliyor
Bu araç yalnızca boş veritabanlarında faydalı görünüyor
Veri migration'larını ele alamıyor; örneğin JSONB kolonunu yapısal bir forma dönüştürmek gibi durumlarda veya kolon silme sonrası geri migration sırasında
ADD COLUMN … NOT NULLüretmesi nedeniyle gerçek veri içeren tablolarda kullanılamaz