rquery-orm-macros

Crates.iorquery-orm-macros
lib.rsrquery-orm-macros
version1.0.0
created_at2025-09-09 04:14:03.433821+00
updated_at2025-09-09 04:14:03.433821+00
descriptionProcedural macros for rquery-orm.
homepage
repositoryhttps://github.com/luigimonsoft/rquery-orm/rquery-orm-macros
max_upload_size
id1830254
size38,362
Luis Carlos (LuigimonSoft)

documentation

https://docs.rs/rquery-orm/rquery-orm-macros

README

rquery-orm-macros

Procedural macros for rquery-orm. It exposes the #[derive(Entity)] derive and its attributes to turn Rust structs into SQL-mapped entities. The main crate rquery-orm re-exports this derive, so in most cases you can just use rquery_orm::Entity;.

  • Supported backends: SQL Server (tiberius) and PostgreSQL (tokio-postgres)
  • Generates table/column metadata, validations, and SQL helpers

For an overview of the ORM and full examples, check ../README.md or the rquery-orm crate page.

Quick start

use rquery_orm::Entity; // re-exported from rquery-orm

#[derive(Entity, Debug, Clone)]
#[table(name = "Employees", schema = "dbo")] // schema is optional
pub struct Employees {
    #[key(is_identity = true)]
    pub employee_id: i32,

    #[column(required, max_length = 50)]
    pub first_name: String,

    #[column]
    pub last_name: String,
}

The derive implements traits used by rquery-orm:

  • Entity: access to table metadata
  • FromRowNamed and FromRowWithPrefix: mapping from tiberius::Row and tokio_postgres::Row
  • Validatable: attribute-based data validation
  • Persistable: builds SQL for INSERT, UPDATE, and DELETE

It also generates associated constants:

  • YourType::TABLE with the table name
  • For each field, a constant with the column name (e.g. Employees::first_name)

If the first key is i32, String, or uuid::Uuid, it implements KeyAsInt, KeyAsString, or KeyAsGuid to expose self.key().

Available attributes

  • #[table(...)]

    • name = "...": table name (defaults to the struct name)
    • schema = "...": schema name (optional)
  • #[column(...)] (for non-relation fields)

    • Presence only: #[column]
    • Validation:
      • required: value must be present (not None) and, for String, non-empty
      • allow_null = true|false: allow None on Option<T> (defaults to false)
      • allow_empty: allow empty string for String (allowed by default)
      • max_length = N, min_length = N
      • regex = "...": pattern for String
      • Custom error messages: error_required, error_allow_null, error_allow_empty, error_max_length, error_min_length, error_regex
    • Ignore in operations:
      • ignore: ignore the column in all operations
      • ignore_in_update, ignore_in_insert, ignore_in_delete
    • name = "...": column name when it differs from the field
  • #[key(...)] (on key fields)

    • is_identity = true|false: identity/serial column (omitted from INSERT)
    • name = "...": column name if different
    • ignore_in_update, ignore_in_insert: fine-grained control per operation
  • #[relation(...)] (on relation fields, metadata only)

    • foreign_key = "...": FK name in the current entity
    • table = "...": related table
    • table_number = N: logical index/alias (optional)
    • ignore_in_update, ignore_in_insert

Generated SQL and placeholders

Persistable methods construct SQL and parameters using the placeholder style selected by rquery-orm:

  • PlaceholderStyle::AtP@P1, @P2, ... (SQL Server)
  • PlaceholderStyle::Dollar$1, $2, ... (PostgreSQL)

Example (conceptual):

use rquery_orm::PlaceholderStyle;
let (sql, params, has_identity) = entity.build_insert(PlaceholderStyle::Dollar);

Installation

Typically you consume the derive re-exported from the main crate:

[dependencies]
rquery-orm = "1.0.0"

If you really need the macros crate directly (not recommended), add it explicitly:

[dependencies]
rquery-orm-macros = "1.0.0"

License

MIT © Luis Carlos Carrillo

Commit count: 28

cargo fmt