SQLite3 WebAssembly दस्तावेज़ इंडेक्स
(sqlite.org)- आधुनिक WASM-support वाले ब्राउज़र में sqlite3 को सीधे इस्तेमाल करना चाहने वाले developers के लिए WebAssembly·JavaScript API दस्तावेज़ों को एक जगह समेटने वाला hub
- तुरंत शुरू करने के लिए 3-step HOWTO से शुरुआत करें, और download·npm module·build·Emscripten की विस्तृत docs से installation और deployment paths देख सकते हैं
- API docs loading methods, client code recipes, persistent storage, JS API में C structs, virtual tables और table-valued functions लिखने तक फैली हैं
- SQLime, Evolu, SQLiteNext, sqlite-wasm-esm, sqlite-wasm-http जैसे वास्तविक use cases और sql.js, wa-sqlite, absurd-js जैसे पूर्ववर्ती projects को साथ में व्यवस्थित किया गया है
- Browser SQLite, OPFS, IndexedDB, WASI से जुड़ी सामग्री को जोड़कर web environment में SQLite इस्तेमाल करने के implementation options की जल्दी तुलना की जा सकती है
sqlite3 WASM दस्तावेज़ों का दायरा
- यह SQLite project की WebAssembly·JavaScript API documentation है, और आधुनिक WASM-support वाले browsers में sqlite3 इस्तेमाल करने में सक्षम बनाने वाली API को कवर करती है
-
Project guide और support channels
- About the sqlite3 WASM subproject
- Project news
- FAQ: Frequently Asked Questions
- TODOs: planned features और unplanned features दोनों को कवर करता है
- technical support और feedback SQLite forum पर मिलते हैं, और commercial SQLite support contracts रखने वाले लोग मौजूदा support channels का उपयोग कर सकते हैं
-
Run·install·build docs
- three-step HOWTO: sqlite3 WASM module और संबंधित JavaScript API को include करके run करने का तरीका दिखाता है
- Downloads: main project download page पर उपलब्ध
- Prerelease snapshots: समय-समय पर update होते हैं
- npm module
- Building sqlite3 WASM: sqlite3 WASM और संबंधित JS code की build procedure को कवर करता है
- Emscripten build details
-
API और implementation details docs
- The API index: कई API variants और loading·access methods समझाता है
- Cookbook: client-level code के लिए recipes
- Persistent storage options: persistent storage options
- C-structs: JS API में C structs का उपयोग करने का तरीका
- virtual tables: JS में virtual tables और table-valued functions बनाने का तरीका
- API changes: clients को प्रभावित कर सकने वाले API changes
- module symbols app: JavaScript/WASM module में sqlite3 API symbols की list generate करता है
-
Documentation और repository maintenance
Use cases और संबंधित ecosystem
-
इस project का उपयोग करने वाले third-party projects
- SQLime: database browser interface प्रदान करता है
- Evolu: privacy, ease of use, और vendor lock-in न होने पर केंद्रित local-first platform
- SQLiteNext: इस project को next.js के साथ integrate करने का demo
- sqlite-wasm-esm: Vite toolchain में इस project का उपयोग करने का तरीका दिखाता है
- sqlite-wasm-http: HTTP के ज़रिए सीधे serve किए जाने वाले database पर read-only access देने वाला SQLite VFS
-
Prior work और adjacent projects
- Alon Zakai का sql.js: WebSQL को छोड़कर browser में sqlite3 को सीधे इस्तेमाल करने का पहला ज्ञात उदाहरण, और यह 2012 commit तक पीछे जाता है
- Roy Hashimoto का wa-sqlite: sqlite3 database के OPFS storage का पहला ज्ञात implementation, और इसमें JS-side SQLite VFS से जुड़ा काम भी शामिल है
- James Long का absurd-js: sqlite3 database को IndexedDB database के अंदर store करने का तरीका दिखाता है
- postgres-wasm: browser में Postgres database server चलाता है
- Jaccwabyt: WASM में hosted C structs को JS code से manipulate करने वाली छोटी JS library, जिसे इस project के OPFS sqlite3_vfs implementation support के लिए बनाया गया था
- CoWasm: “Collaborative WebAssembly for Servers and Browsers” है, और demo app में sqlite3 shell application का WASM build शामिल है
- absurder-js: Nicholas G. Piesco द्वारा absurd-js की फिर से कल्पना किया गया project, और इसका SQLite forum announcement भी है
- sqlite-wasm-rs:
wasm32-unknown-unknownbuilds के लिए Rust SQLite bindings प्रदान करता है
-
External docs और articles
- Porting WebSQL to OPFS: Google Chrome dev team का SQLite WASM से जुड़ा article
- building SQLite3 for WASI: VMWare OCTO team का WASI के लिए SQLite3 build करने पर article
1 टिप्पणियां
Hacker News की टिप्पणियां
ब्राउज़र में इन-मेमरी SQLite चलाते हुए, अगर WAL लॉग की कॉपी को सर्वर पर उसी तरह स्ट्रीम किया जाए जैसे Litestream और Cloudflare Durable Objects इस्तेमाल करते हैं, तो यह दिलचस्प होगा
इसके लिए WebSocket इस्तेमाल किया जा सकता है, या कभी-कभार
fetch()POST भी संभव लगता है। बाद की विज़िट में सर्वर-साइड डेटा का उपयोग करके क्लाइंट SQLite को फिर से भरने का तरीका होगाहालांकि SQLite फोरम पोस्ट को देखें तो डिफ़ॉल्ट SQLite WASM बिल्ड में WAL मोड शामिल नहीं है, इसलिए शायद कस्टम बिल्ड की ज़रूरत पड़ेगी
इन-मेमरी SQLite WAL का उपयोग नहीं करता, और ब्राउज़र Wasm, SQLite के WAL मोड द्वारा अपेक्षित shared memory API जैसी चीज़ों को सपोर्ट नहीं करता
Litestream को बहुत सटीक WAL कॉन्फ़िगरेशन चाहिए, और native SQLite की डिफ़ॉल्ट कॉन्फ़िगरेशन में यह संयोग से ठीक बैठ जाता है, लेकिन Wasm में इसे दोहराना मुश्किल है
Cloudflare Durable Objects भले ही Litestream से प्रेरित रहे हों, लेकिन उनका वास्तविक कामकाज काफी अलग है, और LiteFS या Turso के साथ भी ऐसा ही है
SQLite बदलावों को स्ट्रीम करने का बड़ा विचार अपने आप में संभव है, लेकिन काम बहुत बड़ा है, और ब्राउज़र Wasm के concurrency model के कारण implementation पेचीदा है
वह फोरम पोस्ट मैंने पहले लिखी थी और server-side Wasm SQLite बिल्ड में WAL चलाया था, लेकिन ब्राउज़र में इस्तेमाल के लायक या संभव विकल्प नहीं था
justjs14हैउस समय का कोड ढूंढना पड़ेगा, लेकिन ब्राउज़र में VFS वाले SQLite को Wasm में compile करके DB खोलना, बदलाव करना, और WAL को सर्वर पर push/pull करने देना संभव बनाया था। मैन्युअल रूप से या WebRTC के ज़रिए ब्राउज़र-टू-ब्राउज़र sync भी संभव था, और अगर ब्राउज़र क्लाइंट को GitHub token दें तो यह GitHub Pages पर भी चलता था
रुचि हो तो मैं इसे फिर से शुरू से चलने लायक बना सकता हूं। उस समय इस approach के साथ काफी प्रयोग किए थे, और मुझे लगता है कि कम से कम कुछ applications के लिए यह उपयोगी हो सकता है
केवल pull feature वाला demo भी यहां है: https://just.billywhizz.io/sqlite/demo/#https://just.billywhizz.io/sqlite/demo/db/chinook.db
“shared memory”
SharedArrayBufferहो सकती है, और अगर DB connection एक बार में सिर्फ एक ही खोला जाए तो सामान्य buffer भी संभव है। उदाहरण के लिए, पहले से आमSharedWorkerके अंदर ऐसा किया जा सकता हैimplementation आसान नहीं होगा, लेकिन निश्चित रूप से संभव है। असल में बड़ी समस्या यह है कि यह row-level नहीं, बल्कि block-level changes को capture करता है
इसलिए इसे पूरे DB replication के लिए इस्तेमाल किया जा सकता है, लेकिन कुछ rows को दूसरे users के साथ साझा करने जैसी partial sync मुश्किल है
partial sync के लिए अगर row-level changes चाहिए, तो triggers या SQLite session extension जैसी चीज़ें इस्तेमाल करनी होंगी: https://sqlite.org/sessionintro.html
PowerSync में client-side triggers इस्तेमाल किए जा रहे हैं, और trigger maintenance के काम के अलावा कोई बड़ा नुकसान नहीं दिखा
उदाहरण के लिए, सामान्य template rendering या कुछ Htmx endpoints को Wasm में चलाने से, सामान्य server-side web framework में भी OP द्वारा कही गई चीज़ जैसी SQLite Wasm storage के साथ offline feature दिया जा सकता है
पूरा Django example: https://github.com/m-butterfield/django_webassembly
macros से client/server को अलग करने वाला minimal Rust example: https://github.com/richardanaya/wasm-service
Wasm के बिना, ज़्यादा macros के साथ मिलती-जुलती चीज़ करने वाला Clojure Electric: https://github.com/hyperfiddle/electric
हाल के Microsoft web tools में B से शुरू होने वाला भी कुछ है
पिछले कुछ वर्षों में Python ecosystem के आश्चर्यजनक रूप से बड़े हिस्से को Wasm support मिला है, जिससे यह approach उपयोगी हो सकता है। स्पष्ट machine learning libraries के अलावा Pygame, Pyxel जैसी game libraries भी हैं, और SDL2 ने support जोड़ दिया है, इसलिए multitouch UI library Kivy support भी जल्द संभव लगता है
किसी भी computer पर code चलाने, और ज़रूरत पड़ने पर web browser sandbox के अंदर platform bureaucracy या fees से बचने की कई नई संभावनाएं दिखती हैं
दस्तावेज़ में लिखा है कि ये components पहली बार 3.40 में public beta के रूप में आए थे, और community feedback के आधार पर 3.41 में API को स्थिर करने की योजना थी
लेकिन SQLite की नवीनतम release 2024-08-13 की 3.46.1 है, इसलिए शायद API पहले ही स्थिर हो चुकी है, बस दस्तावेज़ अपडेट नहीं हुआ लगता है
अगर SQLite team WASM version को bundle करके कोई आधिकारिक npm package निकाले, तो वह distribution का अच्छा तरीका होगा। बाद में देखा तो replies के मुताबिक यह पहले से मौजूद है
व्यक्तिगत रूप से मेरा पसंदीदा SQLite-in-WASM अब भी Pyodide वाला variant है। यह official SQLite implementation से काफ़ी पहले से मौजूद था, और Pyodide इस्तेमाल करने पर Python standard library के हिस्से के रूप में WASM SQLite साथ आता है
https://lite.datasette.io/ में इसका इसी तरह इस्तेमाल हो रहा है, और https://pyodide.org/en/stable/console.html पर भी इसे आज़माया जा सकता है
sqlite3.connect(':memory:')सेselect sqlite_version()चलाने पर 2022-06-25 का 3.39.0 आता है, इसलिए लगता है Pyodide को version upgrade की ज़रूरत है। लगता है यह version emscripten से inherit होता है: https://github.com/emscripten-core/emscripten/blob/main/tools/ports/sqlite3.pyहालांकि SQLite team की ओर से official npm package जारी होने वाला नहीं है। हम केवल pure JS distribute करते हैं, और language के बाहर tooling support वाले rabbit hole में जाने से साफ़ मना करते हैं। project members में से कोई भी ऐसे tools इस्तेमाल नहीं करता
Thomas Steiner द्वारा maintain किया गया “officially blessed” npm build हम support करते हैं, लेकिन किसी भी JS framework को सक्रिय रूप से development target नहीं बनाते
किसी खास framework, npm सहित, को सीधे support करने से ऐसा impression हो सकता है कि हम उस framework को endorse कर रहे हैं, और हम third-party projects के endorsement से सक्रिय रूप से बचते हैं
@sqlite.org/sqlite-wasmकोjsdelivrसे import करकेsqlite3-bundler-friendly.mjsऔरsqlite3.wasmload कर लेंतब SQLite का C API और
oo1object-oriented API इस्तेमाल किया जा सकता है, और यह सामान्यtype=modulescript tag या Deno में भी चलता हैउदाहरण HTML यहां है: https://github.com/Ciantic/experimenting-sqlite-wasm/blob/main/standalone.html
sqlite-wasmPyodide की तुलना में काफ़ी तेज़ load होता है, इसलिए अगर Python की ज़रूरत नहीं है तो पहला विकल्प बेहतर हैहालांकि यह काफ़ी सीमित लगता है।
sqlite_version()नहीं है, इसलिए version भी check नहीं कर पाया, और repository में version 3.38.1 है, जो काफ़ी पुराना हैमौजूदा DuckDB web shell अभी SQLite extension load नहीं कर सकता, क्योंकि कल आए 1.1.2 के लिए SQLite extension अभी release नहीं हुआ है। पुराने version हाल में update हुए WASM edition के साथ चलते हैं
spatial extension, GDAL, vector search वगैरह भी जोड़े जा सकते हैं: https://github.com/duckdb/duckdb-wasm/releases/tag/v1.29.0
अपना “SQL web shell” बनाना भी बहुत मुश्किल नहीं था, लेकिन documentation पूरी तरह पर्याप्त नहीं थी
https://github.com/duckdb/sqlite_scanner/blob/main/src/sqlite/sqlite3.h
Go में इस्तेमाल करते समय ncruces का Wasm SQLite package https://github.com/ncruces/go-sqlite3 मुझे सच में बहुत पसंद है
cznic का Go package भी शानदार है, लेकिन यह Wasm version OpenBSD जैसे environments में भी अच्छी तरह चलता है
WebSQL को बस SQLite ही होना चाहिए था, और अगर ऐसा होता तो offline-first और overall app storage ecosystem कहीं बेहतर होता
क्या अब भी इसकी संभावना है? SQLite को abstract करने और जरूरत से ज्यादा specify करने के बजाय, क्या browsers द्वारा support किए जाने वाले SQLite API version को specify करके उसे समय-समय पर upgrade नहीं किया जा सकता?
web के core सिद्धांतों में से एक यह है कि जहां तक हो सके पुरानी चीज़ें चलती रहनी चाहिए, और ऐसे breaking changes मुश्किल होते हैं
भले ही spec कुछ versions सूचीबद्ध करे और web pages को चुनने दे, browsers पर उन पुराने SQLite versions को बनाए रखने का कठिन बोझ आ जाएगा जो शायद अब support में न हों। हर version फिर लगभग 1MB जगह भी लेगा
ऐसे में लगता है कि बेहतर यही है कि अभी की तरह हर website को अपनी पसंद की कीमत खुद चुकाने दी जाए
अगर common resources को बार-बार download करने की चिंता है, तो यह समस्या दूसरे CDNs ने भी पहले से स्वीकार की हुई है। common dependencies के shared caching का समाधान SQLite तक सीमित रहने की तुलना में कहीं अधिक मूल्यवान होगा
मौजूदा तरीका browser-provided version से बेहतर लगता है
अब जरूरत पड़ने पर 410KB compressed WASM blob के रूप में latest SQLite लाया जा सकता है। अगर हम browser द्वारा impose किए गए SQLite version से बंधे होते, तो शायद आज 10 साल पुराना version इस्तेमाल कर रहे होते
पेज को जल्दी-जल्दी देखने पर use case ठीक से समझ नहीं आया
और साफ़ कहें तो, क्या यह IndexedDB का विकल्प बन सकता है? क्या डेटा persist होता है, या फिर SQLite file को सीधे File System API या IndexedDB/localStorage में रखना होगा?
अभी इसमें Origin-Private FileSystem(OPFS) और, बहुत सीमित रूप में,
window.localStorage,window.sessionStoragebackends के ज़रिए storage शामिल हैहाल में local-first क्षेत्र में काफी रुचि है, लेकिन browser के built-in storage API, खासकर IndexedDB, इस्तेमाल करने की तुलना में SQLite को embed करना काफ़ी भारी लगता है
मुख्य open source libraries भी आम तौर पर built-in API ही इस्तेमाल करती दिखती हैं
WebAssembly के ज़रिए एक और executable डालने की कोशिश करने के बजाय, मैं browser native storage के ऊपर SQLite-जैसी API और sync देने वाला open source समाधान देखना चाहूँगा
if()filter की जगहWHEREclause इस्तेमाल करने पर memory और CPU भी कम लग सकते हैंofficial download page से लेकर
mjsfiles और “bundler-friendly” files सब हटाने के बाद भी, minimum SQLite Wasm dependency लगभग 1.3MB की हो जाती हैbrowser app के लिए यह थोड़ा बड़ा लगता है, लेकिन आजकल Wasm दूसरी जगहों पर भी चलता है, इसलिए उन environments में यह ज़्यादा समझ में आ सकता है
sqlite3.jsऔर Wasm मूल रूप से 1.3MB हैं, लेकिन JS को minify करके और दोनों files को Brotli से compress करने पर यह 410KB तक आ जाता हैअगर बात सिर्फ़ user settings store करने की है तो जाहिर है SQLite download करने की ज़रूरत नहीं, लेकिन अगर काम ऐसा है जहाँ पूरी database से फायदा है, तो 1MB की वजह से ज़्यादा चिंता करके बेवजह wheel फिर से invent करने की ज़रूरत नहीं
अगर दूसरा comment सही है, तो network पर यह शुरुआत से ही 1.3MB भी नहीं होगा
फिर भी Figma या Photoshop जैसी apps, या machine learning apps जैसे browser apps में, जहाँ application code और data पहले से ही बड़े होते हैं, वहाँ 1.3MB शायद बड़ा extra बोझ न हो
यह भी सोचने लायक है कि Wasm parsing JS से काफी तेज़ होती है। इस दावे का source अभी नहीं ढूँढ पाया, लेकिन इस पर कम से कम एक अच्छी related post ज़रूर थी
https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API
यह local हो सकता है, central server हो सकता है, या पास का edge हो सकता है
साथ ही WASI अभी answer से काफ़ी दूर है। SQLite amalgamation WASI पर ठीक से build हो जाता है, लेकिन concurrency अब भी अनसुलझी समस्या है
Wasm-based SQLite driver को usable state में लाने के लिए VFS को scratch से बनाना पड़ा
https://github.com/ncruces/go-sqlite3/blob/main/vfs/README.md
कुछ समय तक Rust ecosystem में इसे चलाने की कोशिश की, लेकिन blessed.rs के SQL wrappers
rusqlite,sqlxअभी इसका फायदा नहीं उठा पा रहे थेइसे खुद wrap करना भी मुश्किल था, क्योंकि emscripten Wasm code को
wasm32-unknown-unknownके साथ ठीक से काम कराने का तरीका नहीं मिलाआखिरकार किसी न किसी रूप में JS wrapper चाहिए होता है, और फिर उन crates के expected interface को implement करके JS में expose करना पड़ता है। अगर Rust में यह solve हो जाए तो बहुत अच्छा होगा
असल में
wasm-bindgenमेंextern Cheader के रूप में SQLite emscripten build को import करना होगा, और shared array buffer access possible हो सके इसलिए multi-threaded mode में compile करते हुए VFS को Rust में फिर से implement करना होगाउसके बाद SQLite rows को raw Wasm bytes के रूप में access किया जा सकेगा, और Rust-SQLite style wrapper या integration बनाया जा सकेगा
connection pooling जैसी convenience features फिर भी नहीं होंगी, लेकिन Wasm में DB को exclusive mode में इस्तेमाल करना बेहतर हो सकता है
इस हफ्ते 0.2 release तैयार कर रहे हैं और कुछ issues polish करेंगे। इसके अलावा Diesel ORM को native की तरह इस्तेमाल किया जा सकता है
emscriptenWasm code औरwasm32-unknown-unknownको अच्छी तरह match कराने वाली बात पर अच्छी खबर हैEmscripten और Rust को Wasm में अच्छी तरह साथ काम कराने की योजना है: https://github.com/rustwasm/wasm-bindgen/pull/4014#issuecomment-2356908451
SQLite के Wasm build और Chicory runtime का उपयोग करके pure JVM पर चलने वाली SQLite library बनाई गई: https://github.com/dylibso/sqlite-zero
यह production-ready होने के लक्ष्य से ज़्यादा एक experiment जैसा है, लेकिन dependency-free SQLite tool को JVM ecosystem में लाने के लिए उपयोगी हो सकता है
एक सामान्य सवाल: किन परिस्थितियों में पूरी DB भेजकर browser से query process करवाना ज़्यादा फायदेमंद होता है?
दूसरे शब्दों में, traditional server-hosted DB model की तुलना में user experience बेहतर करने के लिए इसे कब इस्तेमाल किया जाएगा?
सही driver इस्तेमाल करने पर पूरी database भेजने के बजाय ज़रूरी database chunks stream किए जा सकते हैं: https://github.com/mmomtchev/sqlite-wasm-http
पूरी FTS database download किए बिना भी SQLite full-text search किया जा सकता है। search term काफ़ी छोटा हो तो ज़्यादातर हिस्सा मिल जाता है, लेकिन पूरा नहीं
https://medium.com/offline-camp/couchdb-pouchdb-and-hoodie-as-a-stack-for-progressive-web-apps-a6078a985f18
audio library से लेकर 3D modeling software तक संभव है। changes local पर बनाए और persist किए जा सकते हैं, फिर नियमित रूप से या दोबारा online होने पर server side के साथ sync किए जा सकते हैं
ऐसे apps client-side embedded DB के लिए अच्छे candidates हैं