[HN Gopher] Show HN: Doculite - Use SQLite as a Document Database ___________________________________________________________________ Show HN: Doculite - Use SQLite as a Document Database Hi! As I was working on a side project, I noticed I wanted to use SQLite like a Document Database on the server. So I built Doculite. DocuLite lets you use SQLite like Firebase Firestore. It's written in Typescript and an adapter on top of sqlite3 and sqlite. Reasons: 1) Using an SQL Database meant having less flexibility and iterating slower. 2) Alternative, proven Document Databases only offered client/server support. 3) No network. Having SQLite server-side next to the application is extremely fast. 4) Replicating Firestore's API makes it easy to use. 5) Listeners and real-time updates enhance UX greatly. 6) SQLite is a proven, stable, and well-liked standard. And, apparently one of the most deployed software modules right now. (src: https://www.sqlite.org/mostdeployed.html) What do you think? Feel free to comment with questions, remarks, and thoughts. Happy to hear them. Thanks Author : thenorthbay Score : 32 points Date : 2023-08-07 20:14 UTC (2 hours ago) (HTM) web link (www.npmjs.com) (TXT) w3m dump (www.npmjs.com) | [deleted] | tracker1 wrote: | Kind of nifty... Just curious if this is using the JSON | functions/operators for SQLite under the covers? | | https://www.sqlite.org/json1.html | | Edit: where is the database file stored? A parameter for the | Database() constructor seems obvious, but not seeing it in the | basic sample. | thenorthbay wrote: | Yes - I'm using JSON_extract and generated virtual columns | https://www.sqlite.org/json1.html#jex Edit: the database is | stored in a sqlite.db file in the cwd | simonw wrote: | Found where you're using those: https://github.com/thenorthba | y/doculite/blob/c05d98c209d0031... | | It looks like your tables have a single value column and a id | generated column that extracts $.id from that value: | CREATE TABLE IF NOT EXISTS ${collection} ( | value TEXT, id TEXT GENERATED ALWAYS AS | (json_extract(value, "$.id")) VIRTUAL NOT NULL ) | | GENERATED ALWAYS AS was added in a relatively recent SQLite | version - 2020-01-22 (3.31.0) - do you have a feel for how | likely it is for Node.js users to be stuck on an older | version? I've had a lot of concern about Python users who are | on a stale SQLite for my own projects. | cyanydeez wrote: | I'd see if you can easily port the on top of browser based sqlite | in wasm, that's expand your user base and lead to some of the | "holy Grail" in the offline first/sync systems | bastawhiz wrote: | The one feature that I'd want out of this is atomic writes. If I | have a document and want to increment the value of a field in it | by one, I'm not sure that's possible with Doculite today: if two | requests read the same document at the same time and both write | an incremented value, the value is incremented by one, not two. | | The way _I_ would expect to do this is something like this: | const ref = db.collection('page').doc('foo'); do { | const current = await ref.get(); try { await | ref.set({ likes: current.likes + 1 }, { when: { likes: | current.likes } }); } catch { continue; | } } while (false); | | If `set()` attempts to write to the ref when the conditions in | `when` are not matched exactly, the write should fail and you | should have to try the operation again. In this example, the | `set()` call increments the like value by one, but specifies that | the write is only valid if `likes` is equal to the value that the | client read. In the scenario I provided, one of the two | concurrent requests would fail and retry the write (and succeed | on the second go). | DANmode wrote: | I'd like to enable the same in my startup. | | What are you using for this today? | thenorthbay wrote: | Interesting. Updating values via incrementing them is a use | case I barely had in Firebase. I mostly only dealt with 1-time | updates to values, e.g. by the user or scheduled jobs. In which | scenario would the current design cause you problems? ___________________________________________________________________ (page generated 2023-08-07 23:00 UTC)