Skip to main content

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}