drizzle 0.2.1

A type-safe SQL query builder for Rust
Documentation
#[cfg(feature = "mysql-sync")]
fn main() -> Result<(), Box<dyn std::error::Error>> {
    use drizzle::core::expr::eq;
    use drizzle::mysql::{mysql_sync::Drizzle, prelude::*};
    use mysql::prelude::Queryable as _;

    #[MySQLTable(NAME = "drizzle_example_users")]
    struct User {
        #[column(PRIMARY, AUTO_INCREMENT)]
        id: u64,
        #[column(VARCHAR(255))]
        email: String,
        #[column(VARCHAR(255))]
        name: String,
    }

    #[MySQLIndex(unique)]
    struct UserEmailIndex(User::email);

    #[derive(MySQLSchema)]
    struct Schema {
        users: User,
        users_email_index: UserEmailIndex,
    }

    let url = std::env::var("DRIZZLE_MYSQL_URL")
        .unwrap_or_else(|_| "mysql://drizzle:drizzle@127.0.0.1:3307/drizzle_test".to_owned());
    let options = mysql::Opts::from_url(&url)?;
    let mut connection = mysql::Conn::new(options)?;
    connection.query_drop("DROP TABLE IF EXISTS `drizzle_example_users`")?;

    let (mut db, Schema { users, .. }) = Drizzle::new(connection);
    db.create()?;

    db.insert(users)
        .value(InsertUser::new("alice@example.com", "Alice"))
        .on_duplicate_key_update(UpdateUser::default().with_name("Alice"))
        .execute()?;

    db.transaction(TransactionConfig::default(), |tx| {
        tx.insert(users)
            .value(InsertUser::new("bob@example.com", "Bob"))
            .execute()?;
        Ok(())
    })?;

    let alice: SelectUser = db
        .select(())
        .from(users)
        .r#where(eq(users.email, "alice@example.com"))
        .get()?;
    assert_eq!(alice.name, "Alice");

    let all_users: Vec<SelectUser> = db.select(()).from(users).all()?;
    println!("Users: {all_users:?}");
    Ok(())
}

#[cfg(not(feature = "mysql-sync"))]
fn main() {
    println!(
        "mysql-sync feature not enabled — run with: cargo run --example mysql --features mysql-sync"
    );
}