SQLite में सख्त तालिकाओं को प्राथमिकता दें

Strict Tables बनाम डिफ़ॉल्ट व्यवहार

  • कई लोग तर्क देते हैं कि STRICT तालिकाएँ डिफ़ॉल्ट होनी चाहिए, या भविष्य के संस्करणों में एकमात्र मोड भी।
  • दूसरे लोग कहते हैं कि STRICT सिर्फ़ एक प्राथमिकता है; SQLite का मौजूदा व्यवहार जानबूझकर रखा गया है और उसकी जगह के लिए उपयुक्त है।
  • कुछ लोग एक global pragma या “default sets”/versioned defaults (जैसे “2026.1 defaults का उपयोग करें”) का सुझाव देते हैं, ताकि पुराने कोड को तोड़े बिना strictness और अन्य अधिक सुरक्षित विकल्प सक्षम किए जा सकें।

SQLite की Typing Philosophy और इतिहास

  • SQLite की शुरुआत उस दुनिया में हुई जहाँ “सब कुछ string/number है” (Tcl, dbm-style storage), और इसकी dynamic typing प्रवृत्ति काफी हद तक SQLite 3 तक बनी रही।
  • प्रोजेक्ट दस्तावेज़ flexible typing का स्पष्ट बचाव करते हैं; थ्रेड में आलोचक अक्सर इन तर्कों को असंगत या बाद में गढ़े गए मानते हैं।
  • समर्थक SQLite को Oracle/Postgres के बजाय “fopen के लिए प्रतियोगिता” के रूप में देखते हैं, और strict runtime checks को वैकल्पिक overhead मानते हैं, जब आप application code में correctness साबित कर सकते हैं।

व्यावहारिक चिंताएँ: Types, Dates, Booleans

  • सामान्य शिकायतें:
    • Column types डिफ़ॉल्ट रूप से enforce नहीं होते।
    • native DATE/TIMESTAMP/BOOL types का अभाव, खासकर STRICT mode में यह अजीब लगता है।
    • ऐसे आश्चर्य कि integer columns मनमाना text स्वीकार कर लेते हैं, और strings में NUL bytes length() जैसे functions को प्रभावित करते हैं।
  • उपाय: dates को text या Unix timestamps के रूप में store करें; booleans को integers या bitfields के रूप में; CHECK constraints के ज़रिए enforce करें।

Backward Compatibility और Defaults

  • SQLite बहुत कम ही defaults बदलता है (जैसे foreign keys default रूप से off, WAL default रूप से off), ताकि मौजूदा software टूटे नहीं।
  • कुछ लोग इसे जिम्मेदार व्यवहार मानते हैं; दूसरे इसे नए उपयोगकर्ताओं पर “footguns” एक-एक करके सीखने और disable करने का बोझ मानते हैं।
  • इस पर बहस है कि type acceptance में surprise होना, upgrade के दौरान पुराने code को तोड़ने से खराब failure mode है या नहीं।

Migrations, Tooling, और Modes

  • SQLite में schema migrations को बोझिल माना जाता है; third-party tools और patterns इन्हें सरल बनाने की कोशिश करते हैं।
  • STRICT tables को साधारण ALTER से toggle नहीं किया जा सकता; सामान्य तरीका recreate-and-copy है, हालांकि कुछ tools इसे automate करते हैं।
  • इस बात पर राय अलग-अलग है कि strict mode higher-level language integrations (जैसे Rust/Go ORMs) को बेहतर बनाता है या type mapping को जटिल करता है।