Connessione a MySQL e MariaDB in Salvo con Sqlx
In articoli precedenti abbiamo visto sia come usare Salvo per creare una web api, che Sqlx per connetterci da un db MariaDB/MySQL.
In questo articolo mettiamo tutto insieme.
Ovviamente ho messo il codice tutto nello stesso file per una questione di comodità.
Cominciamo con le dipendenze:
[dependencies]
salvo = "0.79.0"
tokio = { version = "1.45.0", features = ["macros"] }
tracing-subscriber = "0.3.19"
serde = "1.0.219"
sqlx = { version = "0.8.6", features = ["runtime-async-std", "mysql"] }
once_cell = "1.21.3"
Qui sotto il codice:
use salvo::prelude::*;
use sqlx::{MySqlPool, FromRow};
use once_cell::sync::OnceCell;
use serde::Serialize;
static DB_POOL: OnceCell<MySqlPool> = OnceCell::new();
fn db_pool() -> &'static MySqlPool {
DB_POOL.get().expect("DB Pool non inizializzato")
}
#[derive(FromRow, Serialize)]
struct Persona {
id: i32,
email: String,
}
#[handler]
async fn root() -> &'static str {
"Root"
}
#[handler]
async fn lista_utenti(res: &mut Response) {
let query = "SELECT * FROM persone";
let persone: Vec<Persona> = sqlx::query_as::<_, Persona>(query)
.fetch_all(db_pool())
.await
.unwrap_or_else(|_| Vec::new());
res.render(Json(persone));
}
#[tokio::main]
async fn main() {
tracing_subscriber::fmt().init();
let pool = MySqlPool::connect("mysql://root:9211@localhost:3306/test")
.await
.expect("Impossibile connettersi al database");
DB_POOL.set(pool).unwrap();
let router = Router::new()
.get(root)
.push(Router::with_path("persone").get(lista_utenti));
let acceptor = TcpListener::new("127.0.0.1:5800").bind().await;
Server::new(acceptor).serve(router).await;
}
Enjoy!
rust cargo salvo sqlx mysql mariadb
Commentami!