#[derive(AnyTemplate)]
{
// Attributes available to this derive:
#[table]
#[tp_upsert]
#[tp_select_all]
#[tp_select_one]
#[tp_select_page]
#[tp_select_stream]
#[tp_select_count]
#[tp_update]
#[tp_delete]
#[auto]
#[debug_slow]
}
Expand description
AnyTemplate is a database-agnostic version of SqlxTemplate that generates
database operations compatible with multiple database types. This macro generates
functions that work across different databases by using the most common SQL syntax.
§Attributes
AnyTemplate accepts the same attributes as SqlxTemplate:
table: Specifies the name of the table in the database (mandatory).debug_slow: Global debug configuration for all generated functions.auto: Applied to fields that should be excluded from insert statements.tp_select_all,tp_select_one,tp_select_page,tp_select_stream,tp_select_count: Select operation configurations.tp_update: Update operation configurations.tp_delete: Delete operation configurations.tp_upsert: Upsert operation configurations.tp_select_builder,tp_update_builder,tp_delete_builder: Builder pattern configurations.
§Builder Pattern Support
The macro supports fluent builder patterns for query construction with custom WHERE conditions.
§Builder Attributes
tp_select_builder: Builder pattern configuration for SELECT operationstp_update_builder: Builder pattern configuration for UPDATE operationstp_delete_builder: Builder pattern configuration for DELETE operations
§Custom Condition Syntax
Custom conditions are defined using the following syntax:
#[tp_select_builder(
method_name = "SQL_expression_with_placeholders"
)]§Parameter Types
- Auto-mapping:
:field_nameautomatically maps to struct field types - Explicit types:
:param$Typefor custom parameter types - Multiple parameters: Single condition can accept multiple parameters
§Examples
#[tp_select_builder(
with_email_domain = "email LIKE :domain$String",
with_score_range = "score BETWEEN :min$i32 AND :max$i32",
with_active_status = "active = :active" // Auto-mapped to bool
)]§Generated Methods
For each field, the builder generates:
§Field-based Methods
- Equality:
.field_name(value),.field_name_not(value) - Comparison:
.field_name_gt(value),.field_name_gte(value),.field_name_lt(value),.field_name_lte(value) - String operations:
.field_name_like(pattern),.field_name_start_with(prefix),.field_name_end_with(suffix) - Ordering:
.order_by_field_asc(),.order_by_field_desc()
§Builder-specific Methods
§SELECT Builder
- Query execution:
.find_all(),.find_one(),.count(),.find_page(),.stream() - SQL generation:
.build_sql()
§UPDATE Builder
- SET clauses:
.on_field_name(value)- specify which fields to update - WHERE clauses:
.by_field_name(value)- specify which records to update - Execution:
.execute()- returns number of affected rows
§DELETE Builder
- WHERE clauses:
.field_name(value)- specify which records to delete - Execution:
.execute()- returns number of deleted rows
§Usage Examples
§SELECT Builder
let users = User::builder_select()
.email("john@example.com")? // Field-based condition
.score_gte(&75)? // Generated comparison method
.with_email_domain("%@company.com")? // Custom condition
.with_score_range(60, 90)? // Custom condition with multiple params
.order_by_score_desc()? // Generated ORDER BY method
.find_all(&pool)
.await?;§UPDATE Builder
let affected = User::builder_update()
.on_email("newemail@example.com")? // SET email = ?
.on_active(&true)? // SET active = ?
.by_id(&user_id)? // WHERE id = ?
.with_high_score(80)? // Custom WHERE condition
.execute(&pool)
.await?;§DELETE Builder
let deleted = User::builder_delete()
.active(&false)? // WHERE active = false
.with_old_accounts("2023-01-01")? // Custom WHERE condition
.execute(&pool)
.await?;§Validation
- Table alias validation: Prevents use of table aliases (e.g.,
u.field) in custom conditions - Column validation: Ensures referenced columns exist in the struct
- Type safety: Compile-time parameter type checking
- SQL injection protection: Uses parameterized queries
§Performance Features
- Compile-time optimization: SQL templates pre-generated at compile time
- Minimal runtime overhead: Reduced
format!calls and string allocations - Efficient parameter binding: Direct parameter binding without intermediate formatting
§Document generated by LLMs
§Database Compatibility Features
- Generates SQL syntax compatible with multiple database types
- Uses standard SQL features that work across databases
- Avoids database-specific syntax and functions
- Compatible with sqlx::Any database driver
§Example
ⓘ
use sqlx_template::AnyTemplate;
use sqlx::Pool;
#[derive(AnyTemplate, sqlx::FromRow)]
#[table("users")]
#[tp_update(by = "id")]
#[tp_delete(by = "id")]
#[tp_select_one(by = "email")]
pub struct User {
#[auto]
pub id: i32,
pub email: String,
pub password: String,
}
let user = User {
id: 1,
email: "user@example.com".to_string(),
password: "password".to_string()
};
// Database operations work across different database types
let users = User::builder_select()
.find_all(&pool)
.await?;
// Database-agnostic operations:
// User::insert(&user, &pool).await?;
// User::update_by_id(&user, &pool).await?;
// User::delete_by_id(&1, &pool).await?;
// User::find_one_by_email(&"user@example.com".to_string(), &pool).await?;§Note
This macro is designed for maximum database compatibility but may not take advantage of database-specific optimizations. Use database-specific templates for better performance when targeting a single database type.