We value your privacy

This site uses cookies to improve your browsing experience, analyze site traffic, and show personalized content. See our Privacy Policy.

  1. MooseStack
  2. Moose OLAP
  3. Modeling Views

Modeling Views

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 TypeScript or Python. 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],);

Quick Reference

Signature.ts
// new View(name, selectStatement, baseTables)new View(  "view_name",  sql`SELECT ... FROM ${someTable}`,  [someTable, /* other tables or views */],);
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}.

On this page

OverviewBasic UsageQuick Reference
FiveonefourFiveonefour
Fiveonefour Docs
MooseStackHostingTemplatesGuides
Release Notes
Source531
  • Overview
Build a New App
  • 5 Minute Quickstart
  • Browse Templates
  • Existing ClickHouse
Add to Existing App
  • Next.js
  • Fastify
Fundamentals
  • Moose Runtime
  • MooseDev MCP
  • Language Server
  • Data Modeling
Moose Modules
  • Moose OLAP
    • Data Modeling
    • Tables
    • Views
    • Materialized Views
    • Materialized Columns
    • External Data & Introspection
    • External Tables
    • Introspecting Tables
    • Data Access
    • Inserting Data
    • Reading Data
    • Performance & Optimization
    • Schema Optimization
    • Secondary & Data-skipping Indexes
    • TTL (Time-to-Live)
    • Schema Versioning
  • Moose Streaming
  • Moose Workflows
  • Moose APIs & Web Apps
Deployment & Lifecycle
  • Moose Dev
  • Moose Migrate
  • Moose Deploy
Reference
  • API Reference
  • Data Types
  • Table Engines
  • CLI
  • Configuration
  • Observability Metrics
  • Help
  • Release Notes
Contribution
  • Documentation
  • Framework
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],);
Signature.ts
// new View(name, selectStatement, baseTables)new View(  "view_name",  sql`SELECT ... FROM ${someTable}`,  [someTable, /* other tables or views */],);