rustdata logo
person
v0.1.0-alpha Lanzado

La potencia de Spring Data,
la precisión de Rust.

El patrón repository familiar para el ecosistema Rust. CRUD genérico para sqlx y MongoDB con seguridad en tiempo de compilación y cero boilerplate.

100% Tipado seguro
Zero Boilerplate
Any Backend
RustData wordmark and maple leaf logo

Integración perfecta con el ecosistema Rust

api Axum
bolt Tokio
timeline Tracing
data_object Serde

Acceso a datos, oxidado.

Deja de escribir las mismas consultas básicas una y otra vez. Céntrate en tu lógica de dominio mientras RustData gestiona la capa de persistencia.

database

Repositorios CRUD

save, find_by_id, find_all, update y delete generados automáticamente.

code_blocks

Columnas type-safe

La validación de consultas en compilación evita errores en ejecución.

link

Joins/Relaciones

API ergonómica para Uno-a-Muchos y Muchos-a-Muchos.

account_balance

Transacciones

Gestión transaccional fluida entre operaciones.

delete_sweep

Borrado lógico

Soporte integrado para patrones de borrado lógico. Filtra automáticamente los registros eliminados sin modificar tus consultas.

api

Generación de API REST

Funcionalidad opcional para generar rutas axum automáticamente desde tus repositorios.

transform

Migraciones

Gestión de migraciones de esquema integrada nativamente en código.

group_work
dns

Multi-tenancy y caché

Soporte de primera clase para aislamiento por tenant y capas de caché distribuida (Redis/Memcached) integradas en las abstracciones de repositorio.

Rendimiento profesional

Las abstracciones de costo cero te dan la comodidad del patrón repository sin sacrificar el rendimiento bruto de la base de datos.

Rendimiento (req/s) — más es mejor

rustdata
95,420
sqlx (raw)
98,100
Diesel
89,200
SeaORM
75,300

* Benchmarks ejecutados en AWS c6i.2xlarge contra Postgres 15. Consultas SELECT simples.

Cómo se compara

Elegir la crate de persistencia adecuada es clave. Así encaja rustdata en el ecosistema de bases de datos Rust de 2026.

Característica rustdata DieselSeaORMsqlxrusqlite
Categoría cancel Fachada repository + ORM cancel ORM completo (DSL tipado) cancel ORM asíncrono (ActiveRecord) cancel Toolkit SQL (no es un ORM) cancel Wrapper ligero de SQLite
Última versión cancel v0.1.0-alpha cancel 2.3.6 cancel 2.0 cancel 0.8.6 cancel 0.38.0
Backends cancel SQL + MongoDB cancel Solo SQL cancel Solo SQL cancel Postgres · MySQL · SQLite · MSSQL cancel Solo SQLite
Patrón repository y CRUD generado check_circle De primera clase cancel Manual remove_circle_outline Active Record cancel Manual cancel Manual
Verificación en compilación check_circle Consultas validadas por macros check_circle DSL tipada cancel Solo en ejecución check_circle query! contra esquema real cancel Solo en ejecución
Asíncrono por defecto check_circle remove_circle_outline vía diesel-async check_circle check_circle cancel No — solo síncrono
Migraciones integradas check_circle Integradas check_circle Integradas check_circle Integradas cancel De terceros cancel De terceros
Curva de aprendizaje check_circle Baja — estilo Spring cancel Pronunciada check_circle Suave — devs Rails/Django check_circle Baja si sabes SQL cancel Mínima

* Panorama a principios de 2026: Diesel 2.3.6 · SQLx 0.8.6 · SeaORM 2.0 · rusqlite 0.38.0.

psychology_alt

¿Máxima seguridad en compilación?

La DSL tipada de Diesel verifica cada consulta contra tu esquema, al precio de una curva de aprendizaje más pronunciada.

edit_note

¿Prefieres SQL puro?

sqlx valida consultas crudas en compilación contra un esquema real, pero los repositorios y relaciones los escribes a mano.

auto_awesome

¿Quieres ambos, sin boilerplate?

rustdata genera repositorios verificados en compilación sobre sqlx y MongoDB, con la ergonomía familiar de Spring.

code

Menos boilerplate.

USER_REPO.RS
use rustdata::prelude::*;

#[derive(Entity, Debug, Clone)]
pub struct User {
    pub id: Uuid,
    pub email: String,
    pub status: UserStatus,
}

// That's it. Generates findAll, findById, save, delete...
#[repository]
pub trait UserRepository: CrudRepository<User, Uuid> {
    // Custom queries are type-checked at compile time!
    async fn find_by_status(&self, status: UserStatus) -> Result<Vec<User>>;
}
GENERATED.SQL
SELECT id, email, status
FROM users
WHERE status = $1;

Prueba en tiempo de compilación

Detecta errores antes de llegar a producción. Los typos en consultas fallan al compilar.

cargo check
Compiling rustdata-example v0.1.0
error[E0412]: cannot find field `sttaus` in `User`
 --> src/repositories.rs:12:35
  |
12 |     async fn find_by_sttaus(&self, sttaus: UserStatus) -> Result<Vec<User>>;
  |                                   ^^^^^^ help: a field with a similar name exists: `status`
  |
  = note: rustdata macro generated query validation failed

error: could not compile `rustdata-example` due to previous error

Arquitectura de crate fachada

rustdata es una crate fachada diseñada para mantener tus dependencias limpias. Re-exporta elegantemente todo lo que necesitas de nuestro ecosistema modular.

  • rustdata-core // Traits and types
  • rustdata-macros // #[derive(Entity)], #[crud]
  • rustdata-migrations // Schema management
# Cargo.toml
[dependencies]
rustdata = { version = "0.1", features = ["postgres"] }
tokio = { version = "1.0", features = ["full"] }
Experiencia de desarrollo

Persistencia
declarativa

Define tus entidades una vez. Nuestras potentes macros generan implementaciones robustas y eficientes de repositorios en tiempo de compilación.

  • check_circle Paginación y filtrado automáticos
  • check_circle Validación de esquema en compilación
  • check_circle Asíncrono por defecto
src/main.rs RUST
// Migration
// CREATE TABLE users (id UUID PRIMARY KEY, name VARCHAR(255) NOT NULL);

use rustdata::prelude::*;

#[derive(Entity, Debug, Clone)]
pub struct User {
    id: Uuid,
    name: String,
}

#[crud(entity = User)]
trait UserRepository {}

#[tokio::main]
async fn main() -> Result<()> {
    let db = Database::connect("postgres://...").await?;
    let repo = UserRepositoryImpl::new(db);

    let user = User {
        id: Uuid::new_v4(),
        name: "Alice".to_string(),
    };

    repo.save(&user).await?;
    let found = repo.find_by_id(user.id).await?;

    Ok(())
}