4 ms·
Ive nothing to say but “that’s cool”. I want to try this in NodeJS! I suppose using functions defined by the host with SQLite is cheaper than using similarly d
by tobyhinloopen 2y ago
Ive nothing to say but “that’s cool”. I want to try this in NodeJS!
I suppose using functions defined by the host with SQLite is cheaper than using similarly defined functions in databases that are separated by a network. I wonder what the overhead is.
Also, what’s with the weird UUIDs? Why not use UUIDv7 if you want time-ordered UUIDs?
- postepowanieadm 2y agobetter-sqlite3 got you covered!
- tobyhinloopen 2y agobetter-sqlite3 is (was?) my favorite sqlite3 lib, it is incredibly fast. NodeJS has SQLITE3 support these days! https://nodejs.org/api/sqlite.html https://nodejs.org/api/sqlite.html Interestingly it is NOT async, like better-sqlite3. I wonder why. I've been looking for any public remarks about it, but found nothing.
- postepowanieadm 2y agoThat's nice! I use bun, but it's lack of support for UDF makes me consider switching back to node.
- tehbeard 2y agoI'm starting to second guess my choice of deno. The options for sqlite in that are either via unstable APIs, or limited due to the particulars around WASM.
- throwitaway1123 2y agoThey're going to add it once it stabilizes in Node: https://github.com/denoland/deno/issues/24828#issuecomment-2409989753 https://github.com/denoland/deno/issues/24828#issuecomment-2...
- darthShadow 2y agoThese may be useful reading: https://github.com/TryGhost/node-sqlite3/issues/408#issue-57842933 https://github.com/TryGhost/node-sqlite3/issues/408#issue-57... https://github.com/WiseLibs/better-sqlite3/issues/32#issuecomment-302164699 https://github.com/WiseLibs/better-sqlite3/issues/32#issueco... Copying a quote from the second: > The sqlite3 C API serializes all operations (even reads) within a single process. You can parallelize reads to the database but only by having multiple processes, in which case one process being blocked doesn't affect the other processes anyways. In other words, because sqlite3 serializes everything, doing things asynchronously won't speed up database access within a process. It would only free up time for your app to do other things (like HTTP requests to other servers). Unfortunately, the overhead imposed on sqlite3 to serialize asynchronous operations is quite high, making it disadvantageous 95% of the time.
- ncruces 2y agoThe sqlite3 C API very much does not serialize "all operations within a single process." The way threading and concurrency work in SQLite may not mesh well with NodeJS's concurrency model. I dunno, I'm not an NodeJS/libuv expert. But at the C API level that statement is just wrong. Normally you cannot share a single connection across threads. If you compile SQLite to allow this, yes, it'll serialize operations using locks. The solution is to create additional database connections, not (necessarily) launch another process. With multiple database connections, you can have concurrency, with or without threads. https://sqlite.org/threadsafe.html https://sqlite.org/threadsafe.html Again, whether this is viable in NodeJS, I have no idea. But it's a Node issue, not a C API issue. BTW, we're commenting on a Ruby article, and SQLite in Ruby has seen "recent" advances that increase concurrency through implementing SQLite's BUSY handler in Ruby, which allows the GVL lock to be released, and other Ruby and SQLite code to run while waiting on a BUSY connection. https://fractaledmind.github.io/2023/12/11/sqlite-on-rails-improving-concurrency/ https://fractaledmind.github.io/2023/12/11/sqlite-on-rails-i...
- julik 2y agoThe user-supplied busy handler has been available for a long while, it's just that the Rails connection adapters did not quite use it right. Indeed, there is elevated interest in SQLite these days.
- relistan 2y ago> Also, what’s with the weird UUIDs? Why not use UUIDv7 if you want time-ordered UUIDs? I’m not the author but UUIDv7 came out in about 2022. Guessing this is legacy stuff that long predated that. There were lots of solutions to solve this problem before there was a standard.
- dragonwriter 2y ago> Guessing this is legacy stuff that long predated that. I’m guessing its not, since the tou library seems to be 8 months old and mentions avoiding the need for extensions if you are using it with Postgres as an advantage over using UUIDv7.
- relistan 2y agoGreat, thanks
- dragonwriter 2y ago> Also, what’s with the weird UUIDs? Why not use UUIDv7 if you want time-ordered UUIDs? It looks like the rationale for the Tou library is that some systems do not accept unfamiliar UUID variants as UUIDs, so a time-ordered ID that looks like a UUIDv4 is safer for some legacy systems than a (newer, and less likely recognized) UUIDv7.
- julik 2y agoThis. We did discover, however, that Postgres will, in fact, swallow a UUIDv7 just fine. After having written that library :-)
- dragonwriter 2y agoI kind of thought it would ingest but not generate unknown UUID versions that nonetheless fit the broader UUID structure, but not having tried I didn't want to bring that up.
- julik 2y ago> Why not use UUIDv7 if you want time-ordered UUIDs? It is our flavour of NIH, that said - Tou has a finer-resolution timestamp. We also didn't do our homework right and assumed the v7 UUIDs won't be accepted by Postgres because of a different "version" value.
- julik 2y agoIt is much cheaper, because you won't have roundtrips or requirements for the availability of extensions on the database server end. It's really a very very sweet capability that SQLite is able to provide exactly because it is hosted by the application.
- masklinn 2y ago> I suppose using functions defined by the host with SQLite is cheaper than using similarly defined functions in databases that are separated by a network. “Infeasible” is very fast. sqlite runs in process so you can register a function pointer or five, with a trampoline back into the runtime. Can’t do that over the network, you can create functions but only using the database’s procedural langage(s in the case of Postgres).
- anarazel 2y agoFWIW, the set of procedural languages in postgres is runtime extensible: https://www.postgresql.org/docs/current/sql-createlanguage.html https://www.postgresql.org/docs/current/sql-createlanguage.h...