worker/d1/macros.rs
1/// **Requires** `d1` feature. Prepare a D1 query from the provided D1Database, query string, and optional query parameters.
2///
3/// Any parameter provided is required to implement [`serde::Serialize`] to be used.
4///
5/// Using [`query`](crate::query) is equivalent to using db.prepare('').bind('') in Javascript.
6///
7/// # Example
8///
9/// ```
10/// let query = worker::query!(
11/// &d1,
12/// "SELECT * FROM things WHERE num > ?1 AND num < ?2",
13/// &min,
14/// &max,
15/// )?;
16/// ```
17#[macro_export]
18macro_rules! query {
19 // rule for simple queries
20 ($db:expr, $query:expr) => {
21 $crate::d1::D1Database::prepare($db, $query)
22 };
23 // rule for parameterized queries
24 ($db:expr, $query:expr, $($args:expr),* $(,)?) => {{
25 || -> $crate::Result<$crate::d1::D1PreparedStatement> {
26 let prepared = $crate::d1::D1Database::prepare($db, $query);
27
28 // D1 doesn't support taking in undefined values, so we translate these missing values to NULL.
29 let serializer = $crate::d1::serde_wasm_bindgen::Serializer::new().serialize_missing_as_null(true);
30 let bindings = &[$(
31 ::serde::ser::Serialize::serialize(&$args, &serializer)
32 .map_err(|e| $crate::Error::Internal(e.into()))?
33 ),*];
34
35 $crate::d1::D1PreparedStatement::bind(prepared, bindings)
36 }()
37 }};
38}