drizzle 0.1.14

A type-safe SQL query builder for Rust
Documentation
#![cfg(any(feature = "rusqlite", feature = "turso", feature = "libsql"))]
#![cfg(all(feature = "serde", feature = "uuid"))]

use drizzle::core::expr::*;
use drizzle::sqlite::prelude::*;
use serde::{Deserialize, Serialize};
use uuid::Uuid;

#[derive(Serialize, Deserialize, Debug, PartialEq, Clone, Default)]
pub struct Profile {
    age: i64,
    name: String,
    interests: Vec<String>,
}

#[derive(SQLiteFromRow, Serialize, Deserialize, Debug, PartialEq, Clone, Default)]
pub struct UserResult {
    id: Uuid,
    age: Option<i64>,
}

#[SQLiteTable(NAME = "json_users", STRICT)]
struct JsonUser {
    id: Uuid,
    email: String,
    #[column(JSON)]
    profile: Profile,
}
#[derive(SQLiteSchema)]
struct Schema {
    jsonuser: JsonUser,
}

#[derive(SQLiteFromRow, Debug, PartialEq, Default)]
pub struct JsonReadResult {
    id: Uuid,
    email: String,
    #[json]
    profile: Profile,
}

#[drizzle::test]
fn json_storage(db: &mut TestDb<Schema>) {
    let Schema { jsonuser } = schema;

    let profile = Profile {
        age: 30,
        name: "John".to_string(),
        interests: vec!["Coding".to_string(), "Reading".to_string()],
    };

    let id = Uuid::new_v4();

    let stmt =
        db.insert(jsonuser)
            .values([InsertJsonUser::new(id, "john@test.com", profile.clone())]);

    // let stmt2 =
    //     db.insert(jsonuser)
    //         .values([InsertJsonUser::new(id, "john@test.com", jsonb(profile))]);

    stmt.execute();

    let stmt = db
        .select((
            jsonuser.id,
            cast(
                drizzle::sqlite::expr::json_extract(jsonuser.profile, "age"),
                drizzle::sqlite::types::Integer,
            )
            .alias("age"),
        ))
        .from(jsonuser)
        .r#where(eq(jsonuser.id, id));

    let user: UserResult = stmt.get();

    assert_eq!(user.id, id);
    assert_eq!(user.age, Some(30));

    // Test reading full JSON column back via #[json] on FromRow struct
    let stmt = db
        .select((jsonuser.id, jsonuser.email, jsonuser.profile))
        .from(jsonuser)
        .r#where(eq(jsonuser.id, id));

    let result: JsonReadResult = stmt.get();

    assert_eq!(result.id, id);
    assert_eq!(result.email, "john@test.com");
    assert_eq!(result.profile, profile);
}