Constraints & Meta

Check constraints

#![allow(unused)]
fn main() {
use rango::prelude::*;

#[derive(Model)]
#[model(constraints = [
    CheckConstraint::new("age >= 0").name("chk_age_positive"),
    CheckConstraint::new("price > 0").name("chk_price_positive"),
])]
pub struct Product {
    pub id: FieldUuid,
    pub name: FieldVarchar<1, 255>,
    pub price: FieldDecimal<10, 2>,
    pub age_restriction: FieldInt,
}
}

Generates:

CREATE TABLE "product" (
    "id" UUID PRIMARY KEY,
    ...
    CONSTRAINT "chk_age_positive" CHECK (age >= 0),
    CONSTRAINT "chk_price_positive" CHECK (price > 0)
);

Unique constraints

#![allow(unused)]
fn main() {
#[model(constraints = [
    // Simple unique
    UniqueConstraint::on(&["email"]).name("uniq_email"),

    // Composite unique
    UniqueConstraint::on(&["room", "date"]).name("uniq_booking"),

    // Partial unique (partial unique index on Postgres and SQLite; skipped with a comment on MySQL)
    UniqueConstraint::on(&["email"])
        .condition("deleted_at IS NULL")
        .name("uniq_active_email"),
])]
}

Field-level unique

For single-column uniqueness, #[field(unique)] is simpler:

#![allow(unused)]
fn main() {
#[field(unique)]
pub email: FieldEmail,
}

Default ordering

#![allow(unused)]
fn main() {
#[model(ordering = [asc("name"), desc("created_at")])]
pub struct Article { ... }
}

This ordering is injected automatically into queries on this model.

Unmanaged models

Mark a model as managed = false to exclude it from migrations. Useful for mapping external tables or views:

#![allow(unused)]
fn main() {
#[model(managed = false, table = "external_users")]
pub struct ExternalUser {
    pub id: FieldUuid,
    pub email: FieldEmail,
}
}

Rango won't create or modify this table — you manage it yourself.