Modeling Views
Viewing:
Overview
Views are read-time projections in ClickHouse. A static SELECT
defines the view over one or more base tables or other views. Moose wraps ClickHouse VIEW
with a simple View
class in PythonTypeScript. You provide the view name, the SELECT
, and the list of source tables/views so Moose can order DDL correctly during migrations.
When to use a View
Use View
when you want a virtual read-time projection and don’t need write-time transformation or a separate storage table. For write-time pipelines and backfills, use a Materialized View instead.
Basic Usage
BasicUsage.ts
import { View, sql } from "@514labs/moose-lib";
import { users } from "./Users";
import { events } from "./Events";
export const activeUserEvents = new View(
"active_user_events",
sql`
SELECT
${events.columns.id} AS event_id,
${users.columns.id} AS user_id,
${users.columns.name} AS user_name,
${events.columns.ts} AS ts
FROM ${events}
JOIN ${users} ON ${events.columns.user_id} = ${users.columns.id}
WHERE ${users.columns.active} = 1
`,
[events, users],
);
BasicUsage.py
from moose_lib import View
from tables import users, events
active_user_events = View(
"active_user_events",
"""
SELECT
{events.columns.id} AS event_id,
{users.columns.id} AS user_id,
{users.columns.name} AS user_name,
{events.columns.ts} AS ts
FROM {events}
JOIN {users} ON {events.columns.user_id} = {users.columns.id}
WHERE {users.columns.active} = 1
""",
[events, users],
)
Quick Reference
Signature.ts
// new View(name, selectStatement, baseTables)
new View(
"view_name",
sql`SELECT ... FROM ${someTable}`,
[someTable, /* other tables or views */],
);
Signature.py
# View(name: str, select_statement: str, base_tables: list[OlapTable | View])
View(
"view_name",
"SELECT ... FROM {someTable}",
[someTable],
)
Static SQL recommended
The SELECT
should be static (no runtime parameters). In TypeScript, prefer Moose’s sql
template for safe table/column interpolation; in Python, use string templates with {table.columns.col}
.