sql

Macro sql 

Source
sql!() { /* proc-macro */ }
Expand description

A procedural macro for building SQL queries with embedded expressions.

This macro supports two different syntax forms:

  1. String literal syntax: sql!("SELECT * FROM {table}")
  2. Printf-style syntax: sql!("SELECT * FROM {} WHERE {} = {}", table, column, value)

The macro parses SQL templates and generates type-safe SQL code by:

  • Converting literal text to SQL::text() calls
  • Converting expressions in {braces} to .to_sql() calls on the expression

§Syntax Forms

§String Literal Syntax

Embed expressions directly in the SQL string using {expression}:

use drizzle::{sql, prelude::*};
use drizzle::rusqlite::Drizzle;

#[SQLiteTable(name = "users")]
pub struct Users {
    #[integer(primary)]
    pub id: i32,
    #[text]
    pub name: String,
}

#[derive(SQLiteSchema)]
pub struct Schema { pub users: Users }

let conn = rusqlite::Connection::open_in_memory()?;
let (db, Schema { users }) = Drizzle::new(conn, Schema::new());

let query = sql!("SELECT * FROM {users} WHERE {users.id} = 42");

§Printf-Style Syntax

Use {} placeholders with arguments after the string:

use drizzle::{sql, prelude::*};
use drizzle::rusqlite::Drizzle;

#[SQLiteTable(name = "users")]
pub struct Users {
    #[integer(primary)]
    pub id: i32,
}

#[derive(SQLiteSchema)]
pub struct Schema { pub users: Users }

let conn = rusqlite::Connection::open_in_memory()?;
let (db, Schema { users }) = Drizzle::new(conn, Schema::new());

let query = sql!("SELECT * FROM {} WHERE {} = {}", users, users.id, 42);

§Examples

§Basic Usage

use drizzle::{sql, prelude::*};

#[SQLiteTable(name = "users")]
pub struct Users {
    #[integer(primary)]
    pub id: i32,
}

let users = Users::new();
let query = sql!("SELECT * FROM {users}");
// Generates: SQL::text("SELECT * FROM ").append(users.to_sql())

§Multiple Expressions

use drizzle::{sql, prelude::*};

#[SQLiteTable(name = "users")]
pub struct Users {
    #[integer(primary)]
    pub id: i32,
}

#[SQLiteTable(name = "posts")]
pub struct Posts {
    #[integer(primary)]
    pub id: i32,
    #[integer]
    pub author_id: i32,
}

let users = Users::new();
let posts = Posts::new();
let query = sql!("SELECT * FROM {users} WHERE {users.id} = {posts.author_id}");

§Escaped Braces

Use {{ and }} for literal braces in the SQL:

use drizzle::{sql, prelude::*};

#[SQLiteTable(name = "users")]
pub struct Users {
    #[integer(primary)]
    pub id: i32,
}

let users = Users::new();
let query = sql!("SELECT JSON_OBJECT('key', {{literal}}) FROM {users}");
// Generates: SQL::text("SELECT JSON_OBJECT('key', {literal}) FROM ").append(users.to_sql())

§Requirements

All expressions within {braces} must implement the ToSQL trait.