Der erste Kontakt mit SQLite
(brandur.org)- Nach ein paar Tagen mit SQLite sind mir einige überraschende Nachteile aufgefallen
ALTER COLUMNwird nicht unterstützt. Die offizielle Empfehlung zum Ändern einer Spalte lautet: „Neue Tabelle erstellen“DROP CONSTRAINTwird nicht unterstützt. Die offizielle Empfehlung zum Entfernen einer Constraint lautet: „Neue Tabelle erstellen“- SQLite hat keine Datentypen für Spalten. Datentypen (es gibt nur fünf) gelten nur für Werte, daher kann praktisch alles überall hineingeschrieben werden
- Wenn man eine Spalte mit einem nicht unterstützten oder nicht existierenden Typ anfordert, führt SQLite den falschen Vorgang ohne Warnung oder Fehler aus. Ein Schema wie
CREATE TABLE my_table (id bigserial, messages jsonb[])scheint zu funktionieren, sodass ich am ersten Tag fälschlicherweise dachte, SQLite unterstütze Serial und Arrays - Mit
CREATE TABLE my_table (...) STRICTkann man erzwingen, dass nur einer der fünf unterstützten Typeninteger,real,text,blob,anyerlaubt ist - In letzter Zeit gab es viel Interesse an der neuen
jsonb-Unterstützung von SQLite. Anders als bei Postgres istjsonbjedoch kein echter Datentyp, sondern ein Format, das von den eingebautenjsonb*-Funktionen ein- und ausgegeben wird. Bei dauerhafter Speicherung ist esblob, also einer der fünf Grundtypen - Andere sehr wichtige Typen wie
timestamptzfehlen ebenfalls. Wenn man Datum/Uhrzeit will, speichert man sie als Unix-Timestamp-integeroder als String im ISO8601-Format; für solche Operationen gibt es mehrere eingebaute Funktionen - SQLite hat beeindruckende Features rund um Streaming, die ich gern ausprobieren würde, aber die anfängliche DX-Erfahrung war definitiv etwas holprig
- Manchmal frage ich mich, von welcher Erzählung ich mich zu sehr mitreißen lasse. Ist Postgres zum Beispiel wirklich die beste Datenbank der Welt? Diese Erfahrung hat meine Überzeugung jedenfalls gefestigt. Ja, Postgres ist die beste
6 Kommentare
Es wirkt, als wolle man nicht SQLite, sondern eher SQLHeavy.
Es gibt diese Datenbank und jene Datenbank. Ich hatte den Eindruck, dass SQLite auf seine eigene Weise nach einer bestimmten Philosophie betrieben wird.
Warum wollte man SQLite wie Postgres verwenden?
Das fühlt sich an wie jemand, der zum ersten Mal Linux benutzt und sagt: „Nicht einmal Hancom Office funktioniert richtig, und die Spiele, die ich spiele, laufen auch nicht. Ein Betriebssystem ist eben doch Windows!“
Ist der Hype bzw. das Gerede um sqlite auf Hacker News nicht etwas übertrieben? Seit 2022 wurden auf Hacker News viele Beiträge veröffentlicht, die behaupten, sqlite könne ein separat betriebenes RDBMS ersetzen.
1: https://news.ycombinator.com/item?id=31318708
2. https://news.ycombinator.com/item?id=31152490
3. https://news.ycombinator.com/item?id=34812527
4. https://news.ycombinator.com/item?id=36208568
Außerdem: https://hn.algolia.com/?dateEnd=1720854657&dateRange=custom&da…
Wenn sich der Einsatz von Datenbankprodukten wie Postgres oder MySQL wie Overkill anfühlt, kann SQLite meiner Meinung nach eine durchaus attraktive Alternative sein.
Zum Beispiel können bei kleinen Services die Kosten für eine Managed DB unverhältnismäßig hoch sein, und sie selbst zu betreiben ist wiederum ebenfalls belastend.
SQLite hingegen soll bis zu einer gewissen Größenordnung leistungsmäßig keine Schwächen zeigen, und besonders mit Tools wie Litestream scheint auch der Betriebsaufwand fast wegzufallen, was es vorteilhaft macht.
Ohne überhaupt bis zu Replikationsfunktionen gehen zu müssen, ist
sqlitewirklich gut, weil selbst Backups unkompliziert sind und man nur den Zustand des Service-Daemons verwalten muss. Aber wenn man es an JPA anbinden will, muss man dieses und jenes zusätzlich machen, sodass ich es in Projekten, die man an andere übergeben muss, am Ende doch nicht verwenden kann. Wenn man wie im Originalbeitrag den Willen hat, das Datenschema etwas strenger zu handhaben, passt es für so einen Zweck auch nicht.Ich hatte meinen vorherigen Kommentar nicht zu Ende geschrieben, aber ich wollte sagen, dass die Gerüchte rund um
sqlitedie Illusion erzeugen, als wäresqliteein Alleskönner.