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.
Integración perfecta con el ecosistema Rust
Elige tu camino
¿Migras desde Diesel?
Descubre cómo nuestra API se mapea a los conceptos de Diesel y aprende a migrar tus modelos.
Leer guía arrow_forward¿Escalas con MongoDB?
Descubre nuestra integración NoSQL fluida y el soporte de tipos BSON.
Explorar NoSQL arrow_forward¿Nuevo en Rust Data?
Comienza con nuestra guía rápida completa y crea tu primera app en minutos.
Inicio rápido arrow_forwardAcceso 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.
Repositorios CRUD
save, find_by_id, find_all, update y delete generados automáticamente.
Columnas type-safe
La validación de consultas en compilación evita errores en ejecución.
Joins/Relaciones
API ergonómica para Uno-a-Muchos y Muchos-a-Muchos.
Transacciones
Gestión transaccional fluida entre operaciones.
Borrado lógico
Soporte integrado para patrones de borrado lógico. Filtra automáticamente los registros eliminados sin modificar tus consultas.
Generación de API REST
Funcionalidad opcional para generar rutas axum automáticamente desde tus repositorios.
Migraciones
Gestión de migraciones de esquema integrada nativamente en código.
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
* 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 | Diesel | SeaORM | sqlx | rusqlite |
|---|---|---|---|---|---|
| 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 Sí | remove_circle_outline vía diesel-async | check_circle Sí | check_circle Sí | 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.
¿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.
¿Prefieres SQL puro?
sqlx valida consultas crudas en compilación contra un esquema real, pero los repositorios y relaciones los escribes a mano.
¿Quieres ambos, sin boilerplate?
rustdata genera repositorios verificados en compilación sobre sqlx y MongoDB, con la ergonomía familiar de Spring.
Menos boilerplate.
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>>;
} 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.
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"] }
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
// 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(()) }