Connessione a MariaDB/MySQL in Rust e Axum

Mattepuffo's logo
Connessione a MariaDB/MySQL in Rust e Axum

Connessione a MariaDB/MySQL in Rust e Axum

In questo articolo vediamo come connettere Axum a MySQL/MariaDB.

Per la connessione useremo sqlx.

Queste sono tutte le dipendenze:

[dependencies]
axum = "0.8.4"
serde = { version = "1.0.219", features = ["derive"] }
tokio = { version = "1.47.1", features = ["full"] }
sqlx = { version = "0.8", features = ["mysql", "runtime-tokio-rustls", "macros"] }
anyhow = "1.0"

L'ultima è facoltativa ma comoda.

Qui sotto un pò di codice:

use std::net::SocketAddr;
use axum::{routing::get, Json, Router};
use axum::extract::State;
use serde::Serialize;
use sqlx::mysql::MySqlPoolOptions;

#[derive(Serialize, sqlx::FromRow)]
struct User {
  id: u32,
  name: String,
}

#[derive(Clone)]
struct AppState {
  pool: sqlx::MySqlPool,
}

#[tokio::main]
async fn main() -> Result<(), anyhow::Error> {
  let pool = MySqlPoolOptions::new()
      .max_connections(5)
      .connect("mysql://root:9211@localhost:3306/test")
      .await?;

  let state = AppState { pool };

  let app = Router::new()
      .route("/", get(root))
      .with_state(state);

  let addr: SocketAddr = "127.0.0.1:3000".parse()?;
  println!("Server avviato: {}", addr);

  axum::serve(tokio::net::TcpListener::bind(addr).await?, app).await?;
  Ok(())
}

async fn root(State(state): State<AppState>) -> Json<Vec<User>> {
  let users: Vec<User> = sqlx::query_as::<_, User>("SELECT id, name FROM users")
      .fetch_all(&state.pool)
      .await
      .unwrap_or_default();

  Json(users)
}

Enjoy!


Condividi

Commentami!