Utilisation des bases de données
use diesel::prelude::*;
use diesel::r2d2::{ConnectionManager, Pool, PoolError, PooledConnection};
use once_cell::sync::OnceCell;
use salvo::prelude::*;
const DB_URL: &str = "postgres://benchmarkdbuser:benchmarkdbpass@tfb-database/hello_world";
type PgPool = Pool<ConnectionManager<PgConnection>>;
static DB_POOL: OnceCell<PgPool> = OnceCell::new();
fn connect() -> Result<PooledConnection<ConnectionManager<PgConnection>>, PoolError> {
DB_POOL.get().unwrap().get()
}
fn build_pool(database_url: &str, size: u32) -> Result<PgPool, PoolError> {
let manager = ConnectionManager::<PgConnection>::new(database_url);
diesel::r2d2::Pool::builder()
.max_size(size)
.min_idle(Some(size))
.test_on_check_out(false)
.idle_timeout(None)
.max_lifetime(None)
.build(manager)
}
fn main() {
DB_POOL
.set(build_pool(&DB_URL, 10).expect(&format!("Erreur de connexion à {}", &DB_URL)))
.ok();
}
#[handler]
async fn show_article(req: &mut Request, res: &mut Response) -> Result<(), Error> {
let id: i64 = req.param::<i64>("id").unwrap_or_default();
let conn = connect()?;
let article = articles::table.find(id).first::<Article>(&conn)?;
res.render(Json(row));
Ok(())
}
use sqlx::{Pool, PgPool};
use once_cell::sync::OnceCell;
pub static DB_POOL: OnceCell<PgPool> = OnceCell::new();
pub fn db_pool() -> &PgPool {
DB_POOL.get().unwrap()
}
pub async fn make_db_pool(db_url: &str) -> PgPool {
Pool::connect(&db_url).await.unwrap()
}
#[tokio::main]
async fn main() {
let pool = make_db_pool().await;
DB_POOL.set(pool).unwrap();
}
[dependencies]
async-std = "1.11.0"
fast_log = "1.5.24"
log = "0.4.17"
once_cell = "1.12.0"
rbatis = "4.0.7"
rbdc = "0.1.2"
rbdc-mysql = "0.1.7"
rbs = "0.1.2"
salvo = { path = "../../salvo" }
serde = { version = "1.0.143", features = ["derive"] }
tokio = { version = "1.20.1", features = ["macros"] }
tracing = "0.1.36"
tracing-subscriber = "0.3.15"
serde_json = "1.0"
#[macro_use]
extern crate rbatis;
extern crate rbdc;
use once_cell::sync::Lazy;
use rbatis::Rbatis;
use salvo::prelude::*;
use serde::{Serialize, Deserialize};
use rbdc_mysql::driver::MysqlDriver;
pub static RB: Lazy<Rbatis> = Lazy::new(|| Rbatis::new());
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct User {
pub id: i64,
pub username: String,
pub password: String,
}
impl_select!(User{select_by_id(id:String) -> Option => "`where id = #{id} limit 1`"});
#[handler]
pub async fn get_user(req: &mut Request, res: &mut Response) {
let uid = req.query::<i64>("uid").unwrap();
let data = User::select_by_id(&mut RB.clone(), uid.to_string()).await.unwrap();
println!("{:?}", data);
res.render(serde_json::to_string(&data).unwrap());
}
#[tokio::main]
async fn main() {
tracing_subscriber::fmt().init();
// informations de connexion MySQL
let mysql_uri = "mysql://root:123456@localhost/test";
RB.link(MysqlDriver {}, mysql_uri).await.unwrap();
// routeur
let router = Router::with_path("users").get(get_user);
tracing::info!("Écoute sur http://127.0.0.1:5800");
let acceptor = TcpListener::new("127.0.0.1:5800").bind().await; Server::new(acceptor).serve(router).await;
}
SeaORM est un ORM asynchrone et dynamique qui offre un support puissant pour les bases de données relationnelles, incluant les relations entre entités, un système de migrations et un constructeur de requêtes type-safe complet. Idéal pour les projets de moyenne à grande envergure nécessitant un ORM complet.
Toasty est un ORM développé par l'équipe Tokio, actuellement en développement actif. Il se concentre sur l'intégration étroite avec l'écosystème Tokio. Peut convenir aux projets dépendant de Tokio et ouverts à adopter des technologies émergentes.
Le SDK Rust de SurrealDB permet de se connecter à cette base de données multi-modèles, adaptée aux applications manipulant des données en graphe, des documents et des données relationnelles. Un choix judicieux pour les projets nécessitant une modélisation flexible des données.