prqlx 0.2.1

A procedural macro for using PRQL in sqlx
Documentation
use prqlx::{query, query_as};
use sqlx::{migrate::MigrateDatabase, Sqlite, SqlitePool};

const DB_URL: &str = "sqlite://sqlite.db";

async fn setup_db() -> SqlitePool {
    if !Sqlite::database_exists(DB_URL).await.unwrap_or(false) {
        println!("Creating database {}", DB_URL);
        Sqlite::create_database(DB_URL).await.unwrap()
    } else {
        println!("Database already exists");
    }

    let pool = SqlitePool::connect(DB_URL).await.unwrap();
    sqlx::query("CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY NOT NULL, name VARCHAR(250) NOT NULL);")
        .execute(&pool)
        .await
        .unwrap();

    sqlx::query("INSERT OR IGNORE INTO users (id, name) VALUES (123, 'John Doe');")
        .execute(&pool)
        .await
        .unwrap();

    pool
}

#[tokio::test]
async fn test_query() {
    let pool = setup_db().await;

    let val = query!(
        "
        from users
        select { id, name }
        "
    )
    .fetch_all(&pool)
    .await
    .unwrap();

    println!("{:?}", val);
}

#[derive(Debug)]
#[allow(dead_code)]
struct User {
    id: i64,
    name: String,
}

#[tokio::test]
async fn test_query_as() {
    let pool = setup_db().await;

    let val = query_as!(
        User,
        "
        from users
        select { id, name }
        "
    )
    .fetch_all(&pool)
    .await
    .unwrap();

    assert_eq!(val[0].name, "John Doe");
}

#[tokio::test]
async fn test_query_with_args() {
    let pool = setup_db().await;

    let user_id = 123i64;
    let val = query_as!(
        User,
        "
        from users
        select { id, name }
        filter id == $1
        ",
        user_id
    )
    .fetch_one(&pool)
    .await
    .unwrap();

    assert_eq!(val.name, "John Doe");
}