Diesel.rs

Bases de Datos al estilo de Rust

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