Wie SQLx die Datenbankarbeit in Rust verändert
Stellen Sie sich folgendes vor: Sie haben eine komplexe SQL-Query geschrieben, Ihr Rust-Projekt kompiliert, es ausgeführt und... einen Runtime-Fehler erhalten, weil Sie einen Spaltennamen falsch geschrieben oder ein Argument vergessen haben. Ärgerlich, oder? Besonders in einer Sprache, die sich ihrer Sicherheit rühmt. Genau dieses Problem löst SQLx.
Was ist es eigentlich
SQLx ist keine typische ORM wie Hibernate oder SQLAlchemy. Die Entwickler bezeichnen es als „SQL-Toolkit". Das Hauptmerkmal des Projekts ist, dass es Ihre SQL-Queries direkt zur Kompilierzeit validiert. Wenn Sie einen Tippfehler in SELECT gemacht haben oder versuchen, einen String einzufügen, wo die Datenbank eine Zahl erwartet, lässt Sie der Rust-Compiler einfach nicht den Binary erstellen.
Das Projekt ist vollständig asynchron und in reinem Rust geschrieben (mit Ausnahme des SQLite-Treibers, der eine C-Bibliothek einbindet). Es unterstützt PostgreSQL, MySQL und SQLite. Früher gab es auch MSSQL-Unterstützung, die in Version 0.7 entfernt wurde, mit der Zusage, den Treiber von Grund auf neu zu schreiben.
Query-Validierung zur Kompilierzeit
Das ist wahrscheinlich die größte Stärke der Bibliothek. Anstatt Queries durch Methodenketten (DSL) aufzubauen, wie es Diesel oder SeaORM tun, schreiben Sie einfaches SQL innerhalb eines Makros.
Wie funktioniert das? Während des Builds verbindet sich SQLx mit Ihrer Datenbank (der Pfad wird in der Umgebungsvariable DATABASE_URL angegeben), fragt sie zur Validierung der Query an und gibt Typinformationen zurück. Wenn die Datenbank sagt, dass die Query korrekt ist, generiert das Makro eine anonyme Struktur mit den Ergebnissen.
Übrigens, wenn Sie nicht möchten, dass Ihr CI-Server bei jedem Build die tatsächliche Datenbank abfragt, hat SQLx einen „Offline-Modus". Sie bereiten den Cache mit Query-Metadaten einmal vor, und dann baut sich das Projekt ohne Netzwerkverbindung.
Asynchronie und Leistung
SQLx wurde von Grund auf für async/await entwickelt. Es versucht nicht, eine synchrone API in Threads zu verpacken. Die Bibliothek kann Daten streamen: Wenn Sie eine Million Zeilen exportieren müssen, können Sie diese zeilenweise verarbeiten, während sie vom Socket ankommen, ohne den gesamten Speicher auf einmal zu füllen.
Interessanterweise ist das Projekt nicht an einen bestimmten Runtime gebunden. Sie können tokio, async-std oder actix verwenden — aktivieren Sie einfach das benötigte Feature-Flag in Cargo.toml.
SQLx wurde von Grund auf für async/await entwickelt. Es versucht nicht, eine synchrone API in Threads zu verpacken. Die Bibliothek kann Daten streamen: Wenn Sie eine Million Zeilen exportieren müssen, können Sie diese zeilenweise verarbeiten, während sie vom Socket ankommen, ohne den gesamten Speicher auf einmal zu füllen.
Interessanterweise ist das Projekt nicht an einen bestimmten Runtime gebunden. Sie können tokio, async-std oder actix verwenden — aktivieren Sie einfach das benötigte Feature-Flag in Cargo.toml.
Warum es keine ORM ist
SQLx hat keine vertrauten Konzepte wie „Models" oder „Relationships". Sie beschreiben keine User has_many Posts in Rust-Code. Sie beschreiben sie in der SQL-Query.
Für diejenigen, die gewohnt sind, volle Kontrolle über die Datenbank zu haben, ist das ein enormer Vorteil. Sie nutzen die volle Leistungsfähigkeit Ihres spezifischen DBMS: spezifische Datentypen (wie JSONB in Postgres), Window-Funktionen oder komplexe Trigger. SQLx kümmert sich lediglich um die langweilige Arbeit, Ergebnisse auf Rust-Strukturen abzubilden, über das FromRow-Derive-Makro.
Klein, aber nützlich
Die Bibliothek hat viele kleine Features, für die man normalerweise externe Plugins suchen muss:
- Integrierter Connection-Pool. Kein Bedarf,
r2d2oder ähnliches einzubinden. - Migration-Unterstützung. Es gibt ein CLI-Tool und das
migrate!-Makro, das Migrations direkt in Ihren Binary einbettet. - Unterstützung für
LISTEN/NOTIFYfür PostgreSQL out of the box. - Transaction-Handling, einschließlich verschachtelter Transaktionen über Savepoints.
Lohnt es sich?
SQLx ist perfekt, wenn Sie SQL lieben und die Fähigkeiten Ihrer Datenbank voll ausnutzen möchten, ohne Rusts Typsicherheit zu verlieren.
Allerdings bezahlen Sie für die Query-Validierung zur Kompilierzeit mit längerer Build-Zeit. Wenn Sie Hunderte von query!-Makros haben, kann cargo check spürbar langsamer werden. In solchen Fällen empfehlen Entwickler, das Optimierungslevel für Makros im Development-Profil anzupassen:
Wenn Sie eine klassische ORM mit automatischer Query-Generierung benötigen, schauen Sie sich besser SeaORM an, das übrigens auf SQLx aufbaut.
Insgesamt wirkt das Projekt sehr ausgereift. Es hat über 17.000 Stars auf GitHub und eine aktive Community. Wenn Sie ein neues Rust-Backend starten und keine Angst haben, SQL von Hand zu schreiben — es ist wahrscheinlich die beste Wahl heute.
Ähnliche Projekte