7 पॉइंट द्वारा GN⁺ 2026-02-10 | 1 टिप्पणियां | WhatsApp पर शेयर करें
  • SQL schema के बीच का diff तुलना करके database migration को मैनेज करने वाला CLI-आधारित टूल
  • सामान्य SQL DDL syntax का उपयोग करके RDBMS schema को मैनेज किया जा सकता है
  • MySQL, MariaDB, TiDB, PostgreSQL, SQL Server, SQLite3 जैसे प्रमुख databases को सपोर्ट करता है
  • वेबसाइट पर WebAssembly build का उपयोग करने वाले online demo के जरिए schema comparison और DDL generation फीचर आज़माए जा सकते हैं
  • database बदलावों को idempotent तरीके से मैनेज किया जा सकता है, इसलिए यह stable schema synchronization के लिए उपयोगी है

sqldef का अवलोकन

  • sqldef दो SQL schemas का diff तुलना करके अंतर का विश्लेषण करता है और उसके आधार पर DDL statements generate करने वाला CLI टूल है
    • उपयोगकर्ता existing schema और target schema की तुलना करके आवश्यक बदलाव अपने आप निकाल सकते हैं
    • सामान्य SQL DDL syntax को वैसे ही इस्तेमाल करके migration किया जा सकता है
  • समर्थित databases के रूप में MySQL, MariaDB, TiDB, PostgreSQL, SQL Server, SQLite3 दिए गए हैं

online demo फीचर

  • वेबसाइट पर Online Demo उपलब्ध है, जिससे schema changes को विज़ुअली देखा जा सकता है
    • “Enable DROP” विकल्प के जरिए delete commands को शामिल करना है या नहीं, इसे नियंत्रित किया जा सकता है
    • “Up (current → desired)” सेक्शन में नया column जोड़ना, index बनाना, constraint जोड़ना जैसे example DDL दिखाए जाते हैं
    • “Down (desired → current)” सेक्शन में constraint हटाने जैसे reverse changes के उदाहरण दिए जाते हैं

काम करने का तरीका

  • online demo sqldef के WebAssembly build का उपयोग करके browser के भीतर SQL schema diff चलाता है
    • यह दो schemas के बीच अंतर की गणना करता है और उसके परिणामस्वरूप आवश्यक DDL statements अपने आप generate करता है
    • GitHub repository link के जरिए WebAssembly build source भी देखा जा सकता है

1 टिप्पणियां

 
GN⁺ 2026-02-10
Hacker News टिप्पणियाँ
  • अगर आपको Postgres के लिए ज़्यादा व्यापक कवरेज चाहिए, तो मेरे बनाए pgschema को देखना उपयोगी हो सकता है
    पिछली गर्मियों में मुझे लगा था कि यह काफ़ी हद तक पूरा हो गया है, लेकिन 6 महीनों में यूज़र्स द्वारा रिपोर्ट किए गए 100 से ज़्यादा issues को ठीक करते हुए मुझे समझ आया कि मैं कितना भोला था

    • यह सच में शानदार टूल है। हम अपनी टीम के साथ एक PoC बनाने वाले हैं
      क्या यह कई database clusters में mismatch जाँचने की सुविधा भी देता है?
    • इससे Migra की याद आती है
    • schema migration के लिए यह अच्छा लगता है, लेकिन जब असली data भी migrate करना हो तो update/insert कैसे संभाले जाते हैं, यह जानना चाहूँगा
    • Xata का pg_roll भी विचार करने लायक एक विकल्प है
  • मैंने इसे SQLite के साथ टेस्ट किया, और existing table में foreign key constraint जोड़ने जैसे मुश्किल migration में यह invalid SQL generate करता है
    उदाहरण के लिए ALTER TABLE books ADD CONSTRAINT fk_books_author FOREIGN KEY (author_id) REFERENCES authors (id) जैसा syntax SQLite में allowed नहीं है
    संबंधित दस्तावेज़ के लिए SQLite ALTER TABLE देखें

    • तो क्या आखिरकार foreign key जोड़ने के लिए column drop करके फिर से जोड़ना पड़ता है?
  • मैं Atlas का उपयोग करता हूँ
    migration-based और schema-based दोनों के अपने फायदे-नुकसान हैं, इसलिए मैं एक ही project में दोनों approaches साथ चलाता हूँ
    schema-based तरीका development speed बढ़ाता है, और migration-based तरीका ज़्यादा विश्वसनीय deploys संभव बनाता है

    • मैं Atlas टीम से Ariel हूँ। local में declarative तरीका और real environments में versioned तरीका साथ इस्तेमाल करना एक आम setup है
      Atlas PR में अपने-आप migrations generate कर देता है, इसलिए ज़्यादातर developers को version workflow सीधे संभालना नहीं पड़ता
      संबंधित दस्तावेज़: Declarative vs Versioned Workflows, Atlas Action
    • मैंने भी sqldef और दूसरे विकल्पों को देखते हुए Atlas खोजा था
      इसका साफ़-साफ़ migration flow support मुझे पसंद आया। असली deploy से पहले मैं ठीक-ठीक जानना चाहता हूँ कि कौन से बदलाव लागू होंगे
  • क्या background migrations को support करने वाला कोई अच्छा टूल है?
    उदाहरण के लिए, किसी बड़े table में अस्थायी nullable column जोड़ना, फिर नया code उस column में data लिखना शुरू करे, उसके बाद background में पुराने data को batches में भरना, और अंत में उसे non-nullable बना देना
    अच्छा होगा अगर ऐसा कोई टूल हो जो इस तरह के procedural changes को declarative तरीके से व्यक्त कर सके और code के साथ review·test भी किया जा सके
    अभी ज़्यादातर लोग इसे अस्थायी scripts और manual deploy instructions से संभालते हैं

    • मैं schema migrations खुद लिखता हूँ, लेकिन ज़्यादातर grate का उपयोग करता हूँ
      development environment में इसे सेट करना आसान है, और FastEndpoints-SqlJobQueues जैसे उदाहरण भी हैं
  • यह टूल सच में शानदार है
    इसकी वजह से मैं उसी तरह का फीचर बनाने वाला अपना hobby project छोड़ सकता हूँ
    इसकी जगह अब मैं कोई और नया project शुरू करूँगा जो पहले ही 100 बार हल की जा चुकी समस्या पर हो — जैसे systemd logs मॉनिटर करके errors को email करने वाला कोई simple tool

  • यह देखकर अच्छा लगा कि यह कोई और migration manager नहीं, बल्कि छोटा और उपयोगी टूल है
    यह SQL की कमियों को अच्छी तरह पूरा करता हुआ लगता है। लगता है काश यह Spanner DDL की तरह declarative होता
    Postgres में मैं schema scripts को idempotent बनाए रखने की कोशिश करता हूँ। CREATE TABLE IF NOT EXISTS से शुरू करता हूँ, और नए columns जोड़ते समय ALTER को अलग रखता हूँ
    लेकिन समय के साथ scripts जटिल हो जाते हैं, और स्थिर होने पर मैं ALTER statements को साफ़ करता हूँ
    अगर कभी पुराना backup restore करना पड़े, तो लगता है ऐसा टूल compatibility जल्दी match कराने में मदद कर सकता है

  • यह Entity Framework या sqitch/liquibase की तुलना में कैसा है, यह जानना चाहूँगा
    declarative approach समझ में आती है, लेकिन बड़े production DB में migrations सिर्फ declarative नहीं होते
    आदर्श schema manager को query cost और downtime कम करने की रणनीतियों की समझ होनी चाहिए
    column addition या index changes पूरे table scan को trigger कर सकते हैं

    • इससे भी बड़ी समस्या यह है कि data खुद migration का हिस्सा हो सकता है
      उदाहरण के लिए, Fullname को FirstName और LastName में बाँटना हो तो साधारण diff उससे सिर्फ आधा ही व्यक्त करता है
      EF Core में reversible transformations को Up/Down methods से संभाला जाता है
      मैं जानना चाहूँगा कि इस तरह की अवधारणा के बिना data transformations कैसे संभाले जाते हैं
  • हमने अपने यहाँ XML-based transformation tool बनाया था
    XML, SQL की तुलना में parse करना आसान था, इसलिए XML में defined schema और DB की तुलना करके सिर्फ ज़रूरी changes लागू किए जाते थे
    हम Sybase SQLAnywhere इस्तेमाल करते थे, और जब materialized view जुड़े होते थे तो column add/delete करते समय views और indexes को फिर से बनाना पड़ता था, जिससे काफ़ी जटिलता आती थी
    इसलिए हमने safeguards जोड़े, ताकि column deletion सिर्फ explicit तरीके से allowed हो, और type changes भी सिर्फ सुरक्षित मामलों में ही किए जाएँ
    इसने सैकड़ों on-premise installations में migrations को बहुत सरल बना दिया
    बस XML बदलना होता था, बाकी टूल खुद संभाल लेता था, और ज़रूरत पड़ने पर हम नई capabilities जोड़ सकते थे

  • SQLite में column deletion अच्छी तरह काम नहीं करता
    हाल के versions में DROP COLUMN जोड़ा गया है, लेकिन ज़्यादातर devices पर अभी भी यह supported नहीं है
    उदाहरण में x integer not null जोड़कर DROP की कोशिश की, लेकिन सिर्फ “-- Skipped” message आया
    standard तरीका temporary table बनाकर data copy करने और फिर replace करने का है, लेकिन यह टूल उसे automate नहीं करता
    constraints जुड़े हों तो यहाँ गलती करना आसान होता है, इसलिए यह कमी खलती है
    आखिरकार अगर यह सिर्फ आसान काम ही संभालता है, तो लगता है manually करना बेहतर है

  • यह टूल शायद सिर्फ empty database में ही उपयोगी लगता है
    यह data migrations संभाल नहीं सकता, और उदाहरण के लिए JSONB column को structured form में बदलना, या column delete करने के बाद reverse migration में ADD COLUMN … NOT NULL generate करना जैसी चीज़ें, जिनमें real data वाले tables शामिल हों, वहाँ इसका उपयोग नहीं हो सकता