Soul: A SQLite REST and Realtime Server
thevahidal.github.io
thevahidal.github.io
The submitted page can add a link to the github repo. If it is already there it isn't obvious.
As the links to /api/tables and others are throwing 404, I had to copy & paste the url from the dev snippet to see examples of the API.
Running the server to view documentation helps in ensuring that the docs are current but it will also add unnecessary friction and deter those who want to just look at the API doc for evaluation.
PS: The source url is https://github.com/thevahidal/soul
Signed, with my crypto keys while hacking on side-projects.
(I'm also in the camp of "I don't love it when words change literal meaning" but I've also realized there is literally nothing I can do to stop it)
I mean,
"Let the restfulness flow through you" - lame
"Let the HATEOS flow through you" - now you're cooking with force
An interesting application could be a web-application whose ONLY server is the SqLite -server. The state of the application would be stored into the SqLite database, not into "local storage" etc. Using a relational database is a great improvement in flexibility over using the key-value store of Local Storage.
Could this work? I guess we would need to load one web-page into the browser first to load some HTML and scripts and then that page could use fetch() to get everything else from the SqLite -server.
One possibility could be that each user would have their own copy of the database, let them break it if they want to :-)
There are a few reasons I can see reaching for SQLite behind an API rather than something like Postgres. Portability can be a big benefit and I would expect you don't need to deal with connection pooling.
If I had a service running on a single box and didn't mind setting up my own db backups, I might reach for SQLite just for the ease of standing up new environments for dev and automated testing.
SQLite is great for sharing application data as well. If you have, for example data for a specific event,. It can make sense to use a separate database/file.
Being able to simply copy as a backup/archive is big here.
You might still want your application or services separate. Similarly take a look at Turso or AstroDB for more options. Turso created libSQL as a fork with libSQL server.
I was inspired to write SQLite while working with Informix on DDG-79 and I saw how useful an embedded database would be in some situations, compared to a client/server solution. So I went off and wrote SQLite on my own, while the development contract was on hiatus. There was never a request for SQLite or anything like it coming from the the navy (or more precisely, Bath Iron Works) as they were both very happy with Informix on the ship and Oracle on land and had zero desire for anything new or different. The development team I worked on ended up using SQLite some for prototyping and testing on that project, but it was never deployed to the ship, as far as I know.
So yes, the whole point of SQLite was to build a database that operated as a library linked into the application, rather than as a separate server, as ginko postulates. Design issues on a single system within DDG-79 (Automated Common Diagrams) were the inspiration for that idea, but to say that SQLite was designed for DDG-79 is not true. There was never a request for SQLite coming from the navy or the ship designers. Indeed, there is was a lot of pushback against SQLite. SQLite was just a crazy idea coming from a rogue developer who happened to be working on one of the many on-board systems at that time.
I realize this question is a bit archaic so if there's not really any good answers, no worries - but as I was using Matt's msql in the 2000's in the same way that I now use sqlite, its something I often wonder whenever I set up a new sqlite.db ...
Any chance of WAL2 being included as a standard journal_mode option in the near future? ..or BEGIN CONCURRENT ? :)
Apparently an issue with the M1 is that because of the energy produced when the main gun is fired, internal systems may spontaneously reset. So they had to design around that phenomenon through things like robustness and rapid system restart times.
--
Plenty of these SQLite web front ends exist, including more enticing single static binaries in go, and they are always far too slow to use in anything but toy projects.
Should be standard to bench against a standard SQLite integration (on modern cpu with nvme).
Even PocketBase, for as nice as the UI is, an order of magnitude slower than SQLite directly.
Here's some rough numbers I've found using SELECT * FROM user LIMIT 1; per second ( 1x / 10x / 100x )
SQLite
68,000 / 50,000 / 4,000
SQLite WAL2 (3x Database files)
67,000 / 52,000 / 8,000
Pocketbase (CURL)
15,000 / 2,300 / 234
Pocketbase (Direct)
62,000 / 29,000 / 3,900
ws4sqlite (CURL)
20,000 / 2,600 / 255
Keep in mind that PocketBase do a lot more than just executing a raw DB query. We perform data validation, normalization, serialization, enriching, auto fail-retry to handle additional SQLITE_BUSY errors, etc. All of this comes with some cost and will always have an effect when doing microbenchmarks like this.
The performance would also depend on what version of PocketBase did you try (before or after v0.10), whether you used CGO or the pure Go driver, etc.
For a benchmark closer to "real world" scenarios tested on various servers you can check the results from https://github.com/pocketbase/benchmarks.
There is definitely room for improvements (I haven't done any detailed profiling yet) but the current performance is "good enough" for the purposes the applications PocketBase is intended for (I've shared some numbers regarding a PocketBase app on production in https://github.com/pocketbase/pocketbase/discussions/4254).
Hope the above helps.
Perhaps it's because I'm particularly snarky pre-morning coffee, but this doesn't come across as the welcoming attitude open source is supposed to be and comes across as downright entitled. Especially as the first thing to lead with. Maybe you didn't quite mean it that way?
I'm taking a wild guess to say that you don't have a screaming need to run 'SELECT * FROM user LIMIT 1;' tens of thousands of times per second on SQLite.
And if you did, I'm guessing you prob would be able to write your own API in front of it.
Am I wrong here?
Kudos to the authors of this tool. It looks great and I'd love to try it out on a recent project.
How far you can vertically scale on one server before requiring a split or shard in your data is why it's a big deal.
A) App servers are easy to scale (stateless, add hardware).
B) Database servers are hard to scale (requires changing logic).
If you're immediately hitting B) you're probably screwed.
Or, not every project need the absolute best performance, sometimes good enough is simply good enough?
sqliterg (CURL)
20,000 / 2,500 / 237
For those wondering about write performance...its poor except for direct SQLite. If you're write heavy, look elsewhere, or use SQLite directly (preferably with multiple databases and WAL2).
INSERT INTO users (id) VALUES (..); per second ( 1x / 10x / 100x )
SQLite WAL
11,000 / 3,000 / 300
SQLite WAL2
14,500 / 3,000 / 760
SQLite WAL2 (3x Database files)
29,000 / 6,000 / 1,400
sqliterg (CURL)
1,750 / 181 / blocks indefinitely
If I have an SPA querying a moderately-sized static dataset, then something like this is appealing. I can stand up a container on Fly, store the SQLite DB on the volume, and serve directly from there without needing to worry about # of reads I involve (w/ something like Turso) or all the ops complexity of a real DB.
--
I'm working on something similar for PostgreSQL [0], with an API compatible with the excellent PostgREST [1].
I believe these tools can be of great utility in many projects and represent a generalization compared to the dedicated middleware that was popular a few years ago. Companies like Supabase are demonstrating this.
[0] https://github.com/sted/smoothdb [1] https://github.com/PostgREST/postgrest
I have quite ambitious plans, even though it started as a hobby project. In addition to the already developed DDL functionality and multi-database management, the next main features will include:
* Admin UI
* Projects with templates and versioning
* Migrations and deployment
[1] " Real-time computing (RTC) is the computer science term for hardware and software systems subject to a "real-time constraint", for example from event to system response.[1] Real-time programs must guarantee response within specified time constraints, often referred to as "deadlines".[2] "
Seems like your argument for if this is "realtime" or not depends on parameters not specific by either you or the project.
> The Firebase Realtime Database is a cloud-hosted database. Data is stored as JSON and synchronized in realtime to every connected client.