mcpField
L
lookml-model

lookml-model

github.com/looker-open-sourceData & databases43148 installsUpdated 2w ago
Repository

About lookml-model

A guide to LookML model files for developers, covering connections, includes, and caching. It emphasizes using datagroups to align cache invalidation with ETL/ELT processes.

Key features

  1. 01Configure model connections and labels
  2. 02Use specific include patterns
  3. 03Set the week start day
  4. 04Manage caching with datagroups

Use cases

  1. 01Select view and dashboard files for a LookML model
  2. 02Refresh production dashboard caches based on ETL/ELT state

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/looker-open-source/looker-skills --skill lookml-model

After installing, type/lookml-modelin Claude Code to confirm it loaded.

Details

From the project README

Instructions

  1. Define the Model File: A model file generally corresponds to a single database connection and includes Explores.
  2. Required Parameters:
    • connection: "connection_name": Must match a connection defined in Looker Admin.
    • include: "pattern": Specifies which view and dashboard files are available to the model.
  3. Best Practices:
    • Includes: Avoid include: "*.view" if possible to prevent performance issues and namespace clutter. Use specific paths or wildcards like include: "/views/users.view" or include: "/views/marketing/*.view".
    • Label: Use label: to provide a user-friendly name for the model in the UI.
    • Week Start Day: Set week_start_day: if the business logic requires a specific start day (e.g., monday).
    • Datagroups & Caching: ALWAYS use datagroups for caching policies to align Looker with your ETL/ELT processes.

4. Datagroups & Caching

Datagroups are the preferred mechanism for managing caching policies.

  • Definition: Define in the model file.
  • sql_trigger: A query that returns a single value (e.g., max timestamp). If the value changes, the cache is invalidated.
  • max_cache_age: A fallback duration if the trigger doesn't change.
  • persist_with: Apply the datagroup to Explores or the entire model.
Datagroups vs persist_for
FeatureDatagroups (Recommended)persist_for
TriggerSQL Query (Smart)Fixed Time (Dumb)
AlignmentAligns with ETL/ELT completionMisaligned (guesswork)
ManagementCentralized in Model fileScattered in Explores/Models
Use CaseProduction dashboards, ETL synchronizationAd-hoc queries, Real-time (<1h) needs

Tip

Use persist_for ONLY for real-time dashboards where you need to force a cache refresh every X minutes (e.g., stock tickers, fast-moving inventory). For everything else, use Datagroups.

5. Include Patterns

Use strict patterns to control scope and performance.

PatternDescriptionUse Case
include: "/views/*.view"All views in specific folderStandard modularity
include: "/views/marketing/users.view"Specific filePrecise control, avoids conflicts
include: "/**/*.view"Recursive (all views in project)Avoid unless small project
include: "/dashboards/*.dashboard"All dashboards in folderImporting dashboards

Examples

Basic Model

connection: "thelook"

# Include all views in the views/ folder
include: "/views/*.view"

# Include all dashboards
include: "/*.dashboard"

# Define an Explore (usually better to define in separate files for large projects, but acceptable here for small ones)
explore: orders {
  join: users {
    type: left_outer
    sql_on: ${orders.user_id} = ${users.id} ;;
    relationship: many_to_one
  }
}

Model with Specific Settings

connection: "snowlooker"

label: "eCommerce Analytics"

# Set valid week start day
week_start_day: monday

# Include specific folders
include: "/views/finance/*.view"
include: "/views/marketing/*.view"

Model with Datagroup (Best Practice)

connection: "thelook"

# Define the caching policy
datagroup: ecommerce_etl {
  description: "Triggers when the max created_at date changes in the events table."
  sql_trigger: SELECT MAX(created_at) FROM `project.dataset.events` ;;
  max_cache_age: "24 hours" # Fallback
}

# Apply default caching to all Explores in this model
persist_with: ecommerce_etl

include: "/views/*.view"

explore: orders {
  # This explore inherits 'persist_with: ecommerce_etl' from the model default
}

explore: real_time_dashboard {
  # Override with a different policy if needed
  persist_for: "5 minutes"
}

Comments

Markdown supported