Skip to main content

dml

Attribute Macro dml 

Source
#[dml]
Expand description

Attribute macro for DML (Data Manipulation Language) statements with compile-time validation

This macro generates type-safe, high-performance database operations with automatic parameter binding, pagination injection, and query optimization. All SQL is validated at compile time using SQLx’s compile-time verification.

§Features

  • Compile-time SQL validation - Catches SQL errors during compilation
  • Type-safe parameter binding - Automatic conversion and validation of parameters
  • Pagination support - Automatic injection of LIMIT/OFFSET clauses
  • Query optimization - Smart query planning and execution
  • Error handling - Comprehensive error types with context
  • Generated documentation - Auto-documented methods with query details

§Usage

use sqlx_data_macros::{dml, repo, Pool, Result};
use sqlx::FromRow;

#[derive(FromRow)]
struct User {
    id: i64,
    name: String,
    email: String,
}

#[repo]
trait UserRepo {
    // Simple query returning a single record
    #[dml("SELECT * FROM users WHERE id = $1")]
    async fn find_by_id(&self, id: i64) -> Result<Option<User>>;

    // Query returning multiple records
    #[dml("SELECT * FROM users WHERE active = $1")]
    async fn find_active_users(&self, active: bool) -> Result<Vec<User>>;

    // Insert/Update/Delete operations
    #[dml("INSERT INTO users (name, email) VALUES ($1, $2) RETURNING id")]
    async fn create_user(&self, name: String, email: String) -> Result<i64>;

    // Complex queries with joins
    #[dml("SELECT u.* FROM users u JOIN roles r ON u.role_id = r.id WHERE r.name = $1")]
    async fn find_users_by_role(&self, role_name: String) -> Result<Vec<User>>;

    // Pagination-enabled queries (automatic LIMIT/OFFSET injection)
    #[dml("SELECT * FROM users ORDER BY created_at")]
    async fn find_all_paged(&self) -> Result<Vec<User>>;
}

§Required Imports

use sqlx_data_macros::{dml, repo};
use sqlx_data_integration::{Pool, Result, Database}; // Core database types
use sqlx::FromRow; // For result mapping