Attributes

Use the @Attribute macro to customize how properties are stored in the database.

Unique Constraints

Mark properties as unique to enforce database-level uniqueness:

@Model
final class User {
    @Attribute(.unique)
    var email: String = ""           // Must be unique across all users

    @Attribute(.unique)
    var username: String = ""        // Must be unique across all users

    var name: String = ""            // No constraint
}

Custom Column Names

Map Swift property names to different database column names:

@Model
final class User {
    @Attribute(originalName: "full_name")
    var name: String = ""           // Maps to "full_name" column

    @Attribute(originalName: "email_address")
    var email: String = ""          // Maps to "email_address" column

    @Attribute(originalName: "created_at")
    var createdAt: Date = Date()    // Maps to "created_at" column
}

This is useful when working with existing databases that use snake_case naming conventions.

Multiple Options

Combine multiple attribute options:

@Model
final class User {
    @Attribute(.unique, originalName: "email_address")
    var email: String = ""
}

Available Options

Option Description
.unique Enforces uniqueness constraint in the database
originalName: Maps to a different column name in the database
hashModifier: Custom hash modifier for schema versioning

Automatic Column Naming

By default, property names are converted to snake_case for database columns:

Swift Property Database Column
name name
createdAt created_at
isActive is_active
userProfileURL user_profile_url

Indexes

Create indexes for frequently queried columns (improves query performance):

@Model
final class User {
    @Attribute(.unique)              // Unique constraint also creates an index
    var email: String = ""

    var name: String = ""            // No index
    var createdAt: Date = Date()    // Consider adding index if frequently sorted/filtered
}

Tip: Unique constraints automatically create an index. For non-unique columns that are frequently used in WHERE clauses or ORDER BY, consider manual index creation in your migration scripts.

Next Steps