Diesel.rs
Bases de Datos al
Agenda
- Introducción rápida a la persistencia en APIs Web
- Retomando loadavg-api
- Introducción a Diesel
- Implementación de histórico en loadavg-api
Persistencia de Datos en APIs Web
Servidor Web
API
Persistencia
Recibe solicitudes de los clientes y las redirecciona a las instancias del API
Maneja la solicitud consultando los recursos necesarios para ofrecer una respuesta
Mantiene los datos almacenados de manera persistente entre ejecuciones
Ponga su base de datos aquí
Patrones de Acceso a Datos
- Data Mapper
- Object Relational Mapper
- Active Record
- DAO
- Data Gateway
Servidor Web
API
Capa de Acceso a Datos
Almacenamientode Datos
No mutuamente excluyentes
Pongamos Diesel
Diesel.rs
ORM y Query Builder seguro y extensible para Rust
Soporte a Bases de Datos
Versión 0.11:
- PostgreSQL
- SQLite
- MySQL
Consultas simples
users::table.load(&connection)
SELECT * FROM users;
Rust
SQL
Filtrado de datos
Post::belonging_to(user)
.load(&connection)
SELECT * FROM posts
WHERE user_id = 1;
Rust
SQL
Consultas complejas
let versions = Version::belonging_to(krate)
.select(id)
.order(num.desc())
.limit(5);
let downloads = try!(version_downloads
.filter(date.gt(now - 90.days()))
.filter(version_id.eq(any(versions)))
.order(date)
.load::<Download>(&conn));
Rust
Consultas complejas
SELECT version_downloads.*
WHERE date > (NOW() - '90 days')
AND version_id = ANY(
SELECT id FROM versions
WHERE crate_id = 1
ORDER BY num DESC
LIMIT 5
)
ORDER BY date
SQL
Generación de código y
modelado de datos
#[derive(Queryable)]
pub struct Download {
id: i32,
version_id: i32,
downloads: i32,
counted: i32,
date: SystemTime,
}
Rust
Datos Insertables
#[derive(Insertable)]
#[table_name="downloads"]
pub struct NewDownload {
version_id: i32,
downloads: i32,
counted: i32,
date: SystemTime,
}
Rust
Inserción de datos
let new_downloads = vec![
NewDownload { ... },
NewDownload { ... },
];
insert(&new_downloads)
.into(downloads::table)
.execute(&connection);
Rust
INSERT INTO downloads (...) VALUES
...
SQL
Actualización
post.published = true;
post.save_changes(&connection);
Un objeto
update(Settings::belonging_to(current_user))
.set(&settings_form)
.execute(&connection)
Varios campos en un struct
update(users.filter(email.like("%@a.bc")))
.set(banned.eq(true))
.execute(&connection)
Un grupo de objetos
Instalación
[dependencies]
diesel = { version = "0.11.0", features = ["postgres"] }
diesel_codegen = { version = "0.11.0", features = ["postgres"] }
dotenv = "0.8.0"
Diesel 0.11 requiere Rust 1.15 o superior
$ rustup update stable
Cargo.toml
CLI
$ cargo install diesel_cli
A la práctica..
Diesel.rs
By sebasmagri
Diesel.rs
- 1,505