Views

Views wrap a SQL query. Use {TableName} to reference tables and {TableName.column} to reference columns. Immigrant substitutes actual database names:

view ActiveUsers = sql"""
    SELECT * FROM {User}
    WHERE {User.active} = true
""";

Materialized views use view.materialized:

view.materialized UserStats = sql"""
    SELECT {User.user_id}, count(*) as post_count
    FROM {User}
    JOIN {Post} ON {Post.user_id} = {User.user_id}
    GROUP BY {User.user_id}
""";

When referenced tables or columns are renamed, immigrant automatically recreates the view with updated names.