prqlx

Crates.ioprqlx
lib.rsprqlx
version0.2.1
sourcesrc
created_at2023-12-07 10:41:58.148102
updated_at2024-06-23 15:25:51.431515
descriptionA procedural macro for using PRQL in sqlx
homepage
repositoryhttps://github.com/Suyashtnt/prqlx
max_upload_size
id1060887
size72,693
TNTMan1671 (Suyashtnt)

documentation

README

PRQLX

Combining the query language of PRQL with the macro powers of SQLX.

PRQL is an amazing DSL for sql, but it doesn't have native support in sqlx. This crate bridges the gap by compiling prql in the rust macro itself before it's sent to sqlx (and your database). This means you can use the prql syntax with:

  • All supported sqlx databases
  • Nice compiler errors
  • Fully typed rust

Usage

cargo add prqlx
cargo add sqlx # requires sqlx to be installed by you so you can configure it correctly
use prqlx::{query, query_as};

async fn test_query() {
    // get your sqlx pool in whatever way
    let pool = get_database_pool().await;

    // simply use it like a regular sqlx query, except you now use PRQL!
    let val = query!(
        "
        from users
        select { id, name }
        "
    )
    .fetch_all(&pool)
    .await
    .unwrap();

    // Same thing with query_as!
    // Bindings also just work:tm:
    let val2 = query_as!(
        User,
        "
        from users
        select { id, name }
        filter id == $1
        ",
        123
    )
    .fetch_one(&pool)
    .await
    .unwrap();

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

Caveats

PRQL doesn't natively support ? for bindings. You will have to use s"?" for that. Rather use ${num} for bindings.

Todos

Not all macros have been implemented. The only ones are query and query_as. If you would like another to be added, please file an issue (or make a PR!).

Testing/Contributing

Before running cargo test, the database must first be setup. To do so, run cargo run --example prepare to prepare the sqlite database. After that, you can develop as usual.

Commit count: 5

cargo fmt