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
- Relationships - Define relationships between models
- Defining Models - Back to model basics
- Migrations - Handle schema changes