Expand description
A zero cost and lightweight ORM operations for SQLx.
Lorm generates type-safe database operations at compile time using derive macros.
§Installation
Add the following to your project’s Cargo.toml:
[dependencies]
lorm = { version = "0.2" }
sqlx = { version = "0.8", features = ["runtime-tokio", "sqlite"] }§Quick Example
ⓘ
use lorm::ToLOrm;
use lorm::predicates::Where;
use sqlx::{FromRow, SqlitePool};
#[derive(Debug, Default, Clone, FromRow, ToLOrm)]
struct User {
#[lorm(pk)]
#[lorm(readonly)]
pub id: i32,
#[lorm(by)]
pub email: String,
}
#[tokio::main]
async fn main() -> anyhow::Result<()> {
let pool = SqlitePool::connect("sqlite::memory:").await?;
// Create a user
let mut user = User::default();
user.email = "alice@example.com".to_string();
let user = user.save(&pool).await?;
// Find by field (generated from #[lorm(by)])
let found = User::by_email(&pool, "alice@example.com").await?;
// Query with filtering and pagination
let users = User::select()
.where_email(Where::Eq, "alice@example.com")
.order_by_email()
.desc()
.limit(10)
.build(&pool)
.await?;
// Delete the user
user.delete(&pool).await?;
Ok(())
}§Generated Methods
For a struct with #[derive(ToLOrm)], Lorm generates:
save(&executor)- Insert or update (upsert)delete(&executor)- Delete by primary keyby_{field}(&executor, value)- Find one by field (for#[lorm(by)]fields)with_{field}(&executor, value)- Find all by field (for#[lorm(by)]fields)select()- Start a query builder
§Query Builder
The select() method returns a builder with these methods:
where_{field}(Where::Eq, value)- Filter by comparisonwhere_between_{field}(start, end)- Filter by rangeorder_by_{field}()- Add ordering (chain with.asc()or.desc())group_by_{field}()- Group resultslimit(n)/offset(n)- Paginationbuild(&executor)- Execute and return results
Modules§
Derive Macros§
- ToLOrm
#[derive(ToLOrm)]generate methods for Object Relational Mapping.