sql!() { /* proc-macro */ }Expand description
A procedural macro for building SQL queries with embedded expressions.
This macro supports two different syntax forms:
- String literal syntax:
sql!("SELECT * FROM {table}") - 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.