dev-resources.site
for different kinds of informations.
Diesel vs SQLx in Raw and ORM Modes
Published at
1/12/2025
Categories
rust
postgres
database
axum
Author
yellow_coder
Author
12 person written this
yellow_coder
open
Diesel vs SQLx in Raw and ORM Modes
Rust developers often face a choice between Diesel and SQLx for database interactions. Diesel is a full-featured ORM (Object-Relational Mapper), while SQLx is a compile-time checked, async-friendly query library. Here's a quick comparison of their performance and usage in raw and ORM modes.
Performance Comparison
Mode | Diesel | SQLx |
---|---|---|
Pure ORM Mode | Slightly faster due to optimizations. | Slower compared to Diesel in ORM-like use. |
Query Builder | ~50% slower than SQLx in raw queries. | Faster, especially for raw SQL execution. |
Code Examples
Diesel in ORM Mode
Using Diesel's schema and ORM for managing database queries.
use diesel::prelude::*;
use diesel::pg::PgConnection;
use crate::schema::users;
#[derive(Queryable, Insertable)]
#[table_name = "users"]
struct User {
id: i32,
name: String,
}
fn fetch_users(conn: &PgConnection) -> Vec<User> {
use crate::schema::users::dsl::*;
users.load::<User>(conn).expect("Error loading users")
}
Diesel in Raw Query Mode
Bypassing Diesel's query builder for raw SQL queries.
use diesel::sql_query;
use diesel::pg::PgConnection;
use diesel::RunQueryDsl;
fn fetch_users_raw(conn: &PgConnection) {
let query = "SELECT id, name FROM users;";
let results = sql_query(query).load::<(i32, String)>(conn).expect("Query failed");
println!("{:?}", results);
}
SQLx in Raw Mode
Direct SQL execution using SQLx's async API.
use sqlx::{PgPool, Row};
async fn fetch_users(pool: &PgPool) {
let rows = sqlx::query("SELECT id, name FROM users;")
.fetch_all(pool)
.await
.expect("Query failed");
for row in rows {
let id: i32 = row.get("id");
let name: String = row.get("name");
println!("{} - {}", id, name);
}
}
SQLx in ORM-Like Mode
Using SQLx structs to map query results.
use sqlx::FromRow;
#[derive(FromRow)]
struct User {
id: i32,
name: String,
}
async fn fetch_users(pool: &PgPool) {
let users: Vec<User> = sqlx::query_as!(User, "SELECT id, name FROM users;")
.fetch_all(pool)
.await
.expect("Query failed");
println!("{:?}", users);
}
Key Takeaways
- Diesel excels in ORM mode for its type safety and compile-time guarantees but slows down with its query builder.
- SQLx is faster for raw queries and supports async natively, making it ideal for modern web applications.
For a high-performance, async-friendly environment, SQLx in raw mode is a solid choice. However, if compile-time safety and ease of schema management matter more, Diesel ORM is unbeatable.
axum Article's
17 articles in total
Diesel vs SQLx in Raw and ORM Modes
currently reading
Rust Frameworks
read article
Axum/Tera & Real Shortcodes in Rust: A WordPress-Like Implementation
read article
Bundle frontend into axum binary using include_dir
read article
🦀 Axum - Hello World !
read article
Build a CRUD REST API with Rust Axum | Tutorial
read article
JWT Authentication in Rust [Full Guide: Axum and Actix]
read article
Fallback Routing with Axum
read article
AWS API Gateway with Lambda Web Adapter and Rust (axum)
read article
Server in Axum
read article
rs-api is based on a web/api application created by axum crate
read article
Server-side rendering in Rust - a Dall.E use-case
read article
Building a Proxy Server with Axum | Rust.
read article
Rust Axum - Extracting Query Param of Vec
read article
Process Streaming Uploads with Axum
read article
Getting Started with Axum | Rust
read article
Starter Axum, GraphQL and SeaORM Template
read article
Featured ones: