A Rust SQL templating library with compile-time parsing and type-safe query building.
sqltmpl provides a set of macros and types for working with SQL in Rust. It parses SQL at compile time to extract metadata (tables, columns, query type, parameter counts) and provides type-safe mechanisms for binding parameters and mapping query results to structs.
- Compile-time SQL parsing with the
sql!macro - Automatic metadata extraction: tables, columns, query type, parameter counts
- Type-safe parameterized queries via
Query<T> - Query result mapping with the
#[derive(QueryResult)]macro - SQL function generation with the
sql_fn!macro - Query classification: detect SELECT vs mutating queries (INSERT, UPDATE, DELETE, etc.)
- Zero-cost abstractions - all parsing happens at compile time
Use the sql! macro to parse SQL at compile time and get a Sql type with extracted metadata:
use sqltmpl::sql;
let query = sql!(SELECT id, name FROM users WHERE active = ?);
assert!(query.is_select());
assert!(!query.is_mutating());
assert_eq!(query.tables(), &["users"]);
assert_eq!(query.columns(), &["id", "name"]);
assert_eq!(query.param_count(), 1);
assert!(query.has_params());Create type-safe queries with parameters:
use sqltmpl::{Query, sql};
let sql = sql!(INSERT INTO users (name, email) VALUES (?, ?));
let query = Query::new(sql, ("Alice".to_string(), "alice@example.com".to_string()));
let (sql, params) = query.into_parts();
assert_eq!(sql.param_count(), 2);Define query functions with the sql_fn! macro:
use sqltmpl::sql_fn;
sql_fn! {
pub fn get_active_users() {
SELECT id, name FROM users WHERE active = 1
}
}
let query = get_active_users();Derive QueryResult to map database rows to structs:
use sqltmpl::{QueryResult, SimpleRow, RowAccess};
#[derive(QueryResult)]
struct User {
id: i64,
name: String,
}
let row = SimpleRow::new(vec!["42".to_string(), "Alice".to_string()]);
let user = User::from_row(&row).unwrap();
assert_eq!(user.id, 42);
assert_eq!(user.name, "Alice");The Sql type wraps a SQL string with compile-time extracted metadata:
tables()- Returns referenced tablescolumns()- Returns selected columnsquery_type()- Returns the query type (SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, or Other)is_select()- Returns true for SELECT queriesis_mutating()- Returns true for INSERT, UPDATE, DELETE, DROP queriesparam_count()- Returns the number of?placeholdershas_params()- Returns true if there are any parameters
| Macro | Description |
|---|---|
sql!(...) |
Parses SQL at compile time and returns a Sql type with metadata |
sql_fn! |
Defines functions that return pre-built Query objects |
#[derive(QueryResult)] |
Derives mapping from database rows to struct fields |
RowAccess- Abstracts over row types for column accessFromSql- Converts SQL string values to Rust types (implemented forString,i64,i32,f64,bool)
This project is licensed under the GNU General Public License v3.0 - see the LICENSE file for details.