Connessione a MySQL e MariaDB in Salvo con Sqlx

Mattepuffo's logo
Connessione a MySQL e MariaDB in Salvo con Sqlx

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!


Condividi

Commentami!