diesel README

The project's README from github.com/diesel-rs/diesel. As one markdown file: README.md.

diesel logo

A safe, extensible ORM and Query Builder for Rust

Build Status Crates.io

API Documentation: latest release – main branch

Homepage

Diesel gets rid of the boilerplate for database interaction and eliminates runtime errors without sacrificing performance. It takes full advantage of Rust's type system to create a low overhead query builder that "feels like Rust."

Supported databases:

  1. PostgreSQL
  2. MySQL
  3. SQLite
  4. MariaDB

You can configure the database backend in Cargo.toml:

[dependencies]
diesel = { version = "<version>", features = ["<postgres|mysql|sqlite>"] }

Getting Started

Find our extensive Getting Started tutorial at https://diesel.rs/guides/getting-started. Guides on more specific features are coming soon.

Getting help

If you run into problems, you can come ask for help at in our GitHub Discussions forum. This is also the right place to propose new features or show your applications.

Usage

Simple queries

Simple queries are a complete breeze. Loading all users from a database:

users::table.load(&mut connection)

Executed SQL:

SELECT * FROM users;

Loading all the posts for a user:

Post::belonging_to(user).load(&mut connection)

Executed SQL:

SELECT * FROM posts WHERE user_id = 1;

Complex queries

Diesel's powerful query builder helps you construct queries as simple or complex as you need, at zero cost.

let versions = Version::belonging_to(krate)
  .select(id)
  .order(num.desc())
  .limit(5);
let downloads = version_downloads
  .filter(date.gt(now - 90.days()))
  .filter(version_id.eq_any(versions))
  .order(date)
  .load::<Download>(&mut conn)?;

Executed SQL:

SELECT version_downloads.* FROM 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

Less boilerplate

Diesel codegen generates boilerplate for you. It lets you focus on your business logic, not mapping to and from SQL rows.

That means you can write this:

#[derive(Queryable, Selectable)]
#[diesel(table_name = downloads)]
pub struct Download {
    id: i32,
    version_id: i32,
    downloads: i32,
    counted: i32,
    date: SystemTime,
}

Instead of this without Diesel:

pub struct Download {
    id: i32,
    version_id: i32,
    downloads: i32,
    counted: i32,
    date: SystemTime,
}

impl Download {
    fn from_row(row: &Row) -> Download {
        Download {
            id: row.get("id"),
            version_id: row.get("version_id"),
            downloads: row.get("downloads"),
            counted: row.get("counted"),
            date: row.get("date"),
        }
    }
}

Inserting data

It's not just about reading data. Diesel makes it easy to use structs for new records.

#[derive(Insertable)]
#[diesel(table_name = users)]
struct NewUser<'a> {
    name: &'a str,
    hair_color: Option<&'a str>,
}

let new_users = vec![
    NewUser { name: "Sean", hair_color: Some("Black") },
    NewUser { name: "Gordon", hair_color: None },
];

insert_into(users)
    .values(&new_users)
    .execute(&mut connection);

Executed SQL:

INSERT INTO users (name, hair_color) VALUES
  ('Sean', 'Black'),
  ('Gordon', DEFAULT)

If you need data from the rows you inserted, just change execute to get_result or get_results. Diesel will take care of the rest.

let new_users = vec![
    NewUser { name: "Sean", hair_color: Some("Black") },
    NewUser { name: "Gordon", hair_color: None },
];

let inserted_users = insert_into(users)
    .values(&new_users)
    .get_results::<User>(&mut connection);

Executed SQL:

INSERT INTO users (name, hair_color) VALUES
  ('Sean', 'Black'),
  ('Gordon', DEFAULT)
  RETURNING *

Updating data

Diesel's codegen can generate several ways to update a row, letting you encapsulate your logic in the way that makes sense for your app.

Modifying a struct:

post.published = true;
post.save_changes(&mut connection);

One-off batch changes:

update(users.filter(email.like("%@spammer.com")))
    .set(banned.eq(true))
    .execute(&mut connection)

Using a struct for encapsulation:

update(Settings::belonging_to(current_user))
    .set(&settings_form)
    .execute(&mut connection)

Raw SQL

There will always be certain queries that are just easier to write as raw SQL, or can't be expressed with the query builder. Even in these cases, Diesel provides an easy to use API for writing raw SQL.

#[derive(QueryableByName)]
#[diesel(table_name = users)]
struct User {
    id: i32,
    name: String,
    organization_id: i32,
}

// Using `include_str!` allows us to keep the SQL in a
// separate file, where our editor can give us SQL specific
// syntax highlighting.
sql_query(include_str!("complex_users_by_organization.sql"))
    .bind::<Integer, _>(organization_id)
    .bind::<BigInt, _>(offset)
    .bind::<BigInt, _>(limit)
    .load::<User>(&mut conn)?;

Code of conduct

Anyone who interacts with Diesel in any space, including but not limited to this GitHub repository, must follow our code of conduct.

License

Licensed under either of these:

Contributing

Before contributing, please read the contributors guide for useful information about setting up Diesel locally, coding style and common abbreviations.

Unless you explicitly state otherwise, any contribution you intentionally submit for inclusion in the work, as defined in the Apache-2.0 license, shall be dual-licensed as above, without any additional terms or conditions.

Notable Sponsors and Supporters

We would like to thank all of the sponsors supporting the work on Diesel. Notable large sponsors are:


NLNet Foundation

Prototype Fund

GitHub Secure Open Source Fund

NGI Zero Core

Federal Ministry of Research, Technology and Space (Germany)

GiGa Infosystems GmbH

Bytebase - Open-source Database DevSecOps

Additionally we would like to thank all persons sponsoring the project on GitHub. Without them developing Diesel wouldn't be possible.

diesel (diesel-rs/diesel)

Searching Database…

14.2K ·GitHub
What is this?Diesel is a safe, extensible ORM and query builder for Rust. It removes database boilerplate and runtime errors without sacrificing performance, using Rust's type system so queries 'feel like Rust'.
So it is a library I build into my Rust app, not a standalone tool?Right — it is a Rust crate you add as a dependency. You pick the database backend it targets in Cargo.toml, and your code then builds and runs queries through Diesel's API.
What is involved in adding it to an existing project?Add Diesel as a dependency in Cargo.toml and configure the backend there, then follow the extensive Getting Started tutorial. Guides for more specific features are coming soon.
Which databases can I point it at?Four: PostgreSQL, MySQL, SQLite, and MariaDB, each supported as a selectable backend.
Does all that type-system checking slow queries down at runtime?The README claims no trade-off: Diesel is a low-overhead query builder, and complex queries come 'at zero cost', so the compile-time safety does not cost performance.
Can I use it for free, including in commercial projects?Yes. Diesel is dual-licensed under Apache 2.0 and MIT, so you choose whichever license fits your project; both allow commercial use.
What if I need a query the builder cannot express?Diesel provides an easy-to-use raw SQL API for exactly that — the cases where handwritten SQL is simpler or the builder cannot express the query.
How much row-to-struct mapping code will I write?Almost none. Diesel's codegen generates the boilerplate for you, so you focus on business logic instead of shuttling SQL rows in and out of structs by hand.
After an insert, how do I read back generated values like IDs?Call get_result or get_results instead of execute, and Diesel returns the data from the rows you inserted.
What ways are there to update a row?Codegen can generate several styles: mutating a struct, one-off batch changes, or encapsulating the change in a dedicated struct — whichever fits that part of your app.
What are similar projects?orm, ent, kysely, mybatis-plus, sequelize, efcore, sqlc, sqlalchemy
Creator
diesel-rs
Size
167.1 MB
Stars
14.2K
Age
11y
Commits · 90 Days