>_ DevTrendsnl

Taal

Home

Talen

Secties

Frontend Backend Mobiel DevOps AI / ML GameDev Blockchain Embedded Beveiliging
Rust

Hoe SQLx Databasewerk in Rust Verandert

Stel je dit voor: je hebt een complexe SQL-query geschreven, je Rust-project gecompileerd, het uitgevoerd en... je krijgt een Runtime Error omdat je een kolomnaam verkeerd hebt gespeld of bent vergeten een argument door te geven. Irritant, toch? Vooral in een taal die trots is op zijn veiligheid. Dat is precies het probleem dat SQLx oplost.

What is it anyway

SQLx is geen typische ORM zoals Hibernate of SQLAlchemy. De ontwikkelaars noemen het een "SQL-toolkit". Het hoofdkenmerk van het project is dat het je SQL-queries valideert tijdens het compileren. Als je een typefout maakt in SELECT of probeert een string te proppen waar de database een nummer verwacht, laat de Rust-compiler je simpelweg niet bouwen.

Het project is volledig asynchroon en geschreven in pure Rust (behalve de SQLite-driver, die een C-bibliotheek gebruikt). Het ondersteunt PostgreSQL, MySQL en SQLite. Er was vroeger MSSQL-ondersteuning, maar die werd in versie 0.7 verwijderd, met de belofte om de driver helemaal opnieuw te schrijven.

Query-validatie tijdens het compileren

Dit is waarschijnlijk het sterkste punt van de bibliotheek. In plaats van queries te bouwen via method-chains (DSL), zoals Diesel of SeaORM doen, schrijf je gewone SQL binnen een macro.

Hoe werkt het? Tijdens het bouwen maakt SQLx verbinding met je database (het pad wordt gespecificeerd in de DATABASE_URL environment variable), vraagt het de database om de query te valideren en retourneert type-informatie. Als de database zegt dat de query correct is, genereert de macro een anonieme struct met de resultaten.

Trouwens, als je niet wilt dat je CI-server elke keer tijdens het bouwen de echte database raakt, heeft SQLx een "offline modus". Je bereidt de cache met query-metadata één keer voor, en daarna bouwt het project zonder netwerkverbinding.

Asynchroniciteit en prestaties

SQLx is vanaf de grond opgebouwd voor async/await. Het probeert niet een synchrone API na te bootsen die in threads is gewikkeld. De bibliotheek kan data streamen: als je een miljoen rijen moet exporteren, kun je ze één voor één verwerken terwijl ze via de socket binnenkomen, zonder alle geheugen in één keer te vullen.

Interessant is dat het project niet gebonden is aan een specifieke runtime. Je kunt tokio, async-std of actix gebruiken — schakel gewoon de benodigde feature flag in Cargo.toml in.

SQLx is vanaf de grond opgebouwd voor async/await. Het probeert niet een synchrone API na te bootsen die in threads is gewikkeld. De bibliotheek kan data streamen: als je een miljoen rijen moet exporteren, kun je ze één voor één verwerken terwijl ze via de socket binnenkomen, zonder alle geheugen in één keer te vullen.

Interessant is dat het project niet gebonden is aan een specifieke runtime. Je kunt tokio, async-std of actix gebruiken — schakel gewoon de benodigde feature flag in Cargo.toml in.

Waarom het geen ORM is

SQLx heeft geen vertrouwde concepten zoals "modellen" of "relaties". Je beschrijft geen User has_many Posts in Rust-code. Je beschrijft JOIN in de SQL-query.

Voor degenen die gewend zijn aan volledige controle over de database is dit een enorme plus. Je gebruikt de volledige kracht van je specifieke DBMS: specifieke datatypes (zoals JSONB in Postgres), window functions of complexe triggers. SQLx neemt alleen het saaie werk van het mappen van resultaten naar Rust-structs voor zijn rekening via de FromRow derive-macro.

Klein maar nuttig

De bibliotheek heeft veel leuke kleine dingetjes waar je meestal naar op zoek moet in plugins van derden:

  • Ingebouwde connection pool. Geen noodzaak om r2d2 of iets dergelijks in te pluggen.
  • Ondersteuning voor migraties. Er is een CLI-hulpprogramma en de migrate! macro die migraties rechtstreeks in je binary inbedt.
  • Ondersteuning voor LISTEN/NOTIFY voor PostgreSQL out of the box.
  • Transactie-afhandeling, inclusief geneste transacties via savepoints.

Is het de moeite waard om te gebruiken

SQLx is perfect als je van SQL houdt en de mogelijkheden van je database volledig wilt benutten, zonder de typesafety van Rust te verliezen.

Je betaalt echter voor compile-time query-validatie met bouwtijd. Als je honderden query! macros hebt, kan cargo check merkbaar trager worden. In zulke gevallen raden ontwikkelaars aan om het optimalisatieniveau voor macros in het development-profiel aan te passen:

Als je een klassieke ORM met automatische query-generatie nodig hebt, kun je beter naar SeaORM kijken, dat trouwens bovenop SQLx is gebouwd.

Over het algemeen ziet het project er erg volwassen uit. Het heeft meer dan 17.000 sterren op GitHub en een actieve community. Als je een nieuw Rust-backend start en niet bang bent om SQL met de hand te schrijven — het is waarschijnlijk de beste keuze van dit moment.

Gerelateerde projecten