drizzle 0.3.0

A type-safe SQL query builder for Rust
Documentation
use drizzle::postgres::prelude::*;
use drizzle::postgres::sync::Drizzle;

#[PostgresTable]
struct Users {
    #[column(primary)]
    id: i32,
    name: String,
    email: Option<String>,
    age: i32,
}

#[PostgresTable]
struct Posts {
    #[column(primary)]
    id: i32,
    title: String,
    content: Option<String>,
    #[column(references = Users::id)]
    author_id: i32,
}

#[derive(PostgresSchema)]
struct Schema {
    users: Users,
    posts: Posts,
}

#[derive(PostgresFromRow)]
struct UserPost {
    #[column(Users::name)]
    name: String,
    #[column(Posts::title)]
    title: Option<String>,
}

#[derive(PostgresFromRow)]
struct NameTitle {
    name: String,
    title: Option<String>,
}

#[allow(clippy::type_complexity)]
fn check(mut db: Drizzle<Schema>, Schema { users, posts }: Schema) {
    let _: drizzle::Result<Vec<(SelectUsers, SelectPosts)>> =
        db.select(()).from(users).inner_join(posts).all();
    let _: drizzle::Result<Vec<(SelectUsers, Option<SelectPosts>)>> =
        db.select(()).from(users).left_join(posts).all();
    let _: drizzle::Result<Vec<(Option<SelectUsers>, SelectPosts)>> =
        db.select(()).from(users).right_join(posts).all();
    let _: drizzle::Result<Vec<(Option<SelectUsers>, Option<SelectPosts>)>> =
        db.select(()).from(users).full_join(posts).all();

    let _: drizzle::Result<Vec<(String, String)>> =
        db.select((users.name, posts.title)).from(users).inner_join(posts).all();
    let _: drizzle::Result<Vec<(String, Option<String>, Option<String>)>> = db
        .select((users.name, posts.title, posts.content))
        .from(users)
        .left_join(posts)
        .all();
    let _: drizzle::Result<(Option<String>, Option<String>, String)> = db
        .select((users.name, users.email, posts.title))
        .from(users)
        .right_join(posts)
        .get();
    let _: drizzle::Result<Vec<(Option<String>, Option<String>)>> =
        db.select((users.name, posts.title)).from(users).full_join(posts).all();

    let _: drizzle::Result<Vec<UserPost>> =
        db.select(UserPost::Select).from(users).left_join(posts).all();
    let _: drizzle::Result<Vec<NameTitle>> =
        db.select((users.name, posts.title)).from(users).left_join(posts).all();
}

fn main() {
    let _ = check;
}