>_ DevTrendsit

Lingua

Home

Linguaggi

Sezioni

Frontend Backend Mobile DevOps AI / ML GameDev Blockchain Embedded Sicurezza
Rust

Come SQLx Trasforma il Lavoro con i Database in Rust

Immagina questo: hai scritto una query SQL complessa, compilato il tuo progetto Rust, eseguito e... hai ricevuto un errore runtime perché avevi scritto male un nome di colonna o dimenticato di passare un argomento. Fastidioso, vero? Soprattutto in un linguaggio che si vanta della sua sicurezza. È esattamente questo il problema che SQLx risolve.

Cos'è in sostanza

SQLx non è un tipico ORM come Hibernate o SQLAlchemy. Gli sviluppatori lo definiscono un "toolkit SQL". La caratteristica principale del progetto è che valida le tue query SQL direttamente in fase di compilazione. Se hai fatto un errore di battitura in SELECT o provi a inserire una stringa dove il database si aspetta un numero, il compilatore Rust semplicemente non ti permetterà di buildare il binario.

Il progetto è completamente asincrono e scritto in Rust puro (ad eccezione del driver SQLite, che utilizza una libreria C). Supporta PostgreSQL, MySQL e SQLite. Prima c'era il supporto per MSSQL, ma è stato rimosso nella versione 0.7, con la promessa di riscrivere il driver da zero.

Validazione delle query in fase di compilazione

Questa è probabilmente il punto di forza della libreria. Invece di costruire query attraverso catene di metodi (DSL), come fanno Diesel o SeaORM, scrivi semplice SQL all'interno di una macro.

Come funziona? Durante la build, SQLx si connette al tuo database (il percorso è specificato nella variabile d'ambiente DATABASE_URL), gli chiede di validare la query e restituisce le informazioni sui tipi. Se il database dice che la query è corretta, la macro genera uno struct anonimo con i risultati.

A proposito, se non vuoi che il tuo server CI colpisca il database effettivo ogni volta durante la build, SQLx ha una "modalità offline". Prepari la cache con i metadati delle query una volta, e poi il progetto viene buildato senza connessione di rete.

Asincronia e prestazioni

SQLx è stato progettato da zero per async/await. Non cerca di emulare un'API sincrona avvolta in thread. La libreria può fare streaming dei dati: se devi esportare un milione di righe, puoi elaborarle una per una mentre arrivano dal socket, senza riempire tutta la memoria in una volta.

Interessante è che il progetto non è legato a un runtime specifico. Puoi usare tokio, async-std o actix — basta abilitare il feature flag necessario in Cargo.toml.

SQLx è stato progettato da zero per async/await. Non cerca di emulare un'API sincrona avvolta in thread. La libreria può fare streaming dei dati: se devi esportare un milione di righe, puoi elaborarle una per una mentre arrivano dal socket, senza riempire tutta la memoria in una volta.

Interessante è che il progetto non è legato a un runtime specifico. Puoi usare tokio, async-std o actix — basta abilitare il feature flag necessario in Cargo.toml.

Perché non è un ORM

SQLx non ha concetti familiari come "modelli" o "relazioni". Non descrivi User has_many Posts nel codice Rust. Descrivi JOIN nella query SQL.

Per chi è abituato ad avere il pieno controllo sul database, questo è un enorme vantaggio. Usi tutta la potenza del tuo DBMS specifico: tipi di dati specifici (come JSONB in Postgres), funzioni finestra o trigger complessi. SQLx si occupa solo del lavoro noioso di mappare i risultati agli struct Rust tramite la derive macro FromRow.

Piccoli ma utili dettagli

La libreria ha molte piccole chicche che di solito devi cercare in plugin di terze parti:

  • Connection pool integrato. Non serve collegare r2d2 o simili.
  • Supporto per le migrazioni. C'è un'utilità CLI e la macro migrate! che incorpora le migrazioni direttamente nel tuo binario.
  • Supporto per LISTEN/NOTIFY per PostgreSQL out of the box.
  • Gestione delle transazioni, incluse transazioni nidificate tramite savepoint.

Vale la pena usarlo

SQLx è perfetto se ami SQL e vuoi usare le capacità del tuo database al massimo, senza perdere la type safety di Rust.

Tuttavia, paghi la validazione delle query in fase di compilazione con il tempo di build. Se hai centinaia di macro query!, cargo check può diventare notevolmente più lento. In questi casi, gli sviluppatori consigliano di regolare il livello di ottimizzazione per le macro nel profilo di sviluppo:

Se hai bisogno di un classico ORM con generazione automatica delle query, è meglio che dia un'occhiata a SeaORM, che tra l'altro è costruito sopra SQLx.

Nel complesso, il progetto sembra molto maturo. Ha oltre 17.000 stelle su GitHub e una comunità attiva. Se stai iniziando un nuovo backend Rust e non hai paura di scrivere SQL a mano — è probabilmente la scelta migliore oggi.

Progetti correlati