Skip to main content
marimo provides built-in SQL support, allowing you to query databases and work with results as DataFrames.

Quick Start

The result is automatically displayed as an interactive table and returned as a DataFrame.

Default Engine: DuckDB

By default, mo.sql() uses DuckDB, a fast in-process SQL database:
DuckDB can directly query DataFrames in your Python namespace - just reference them by variable name!

Supported Databases

marimo supports multiple database engines:

DuckDB

Default engine
In-process OLAP database

SQLAlchemy

Universal SQL toolkit
PostgreSQL, MySQL, SQLite, etc.

Ibis

Python DataFrames
Unified API for 20+ backends

Clickhouse

OLAP database
High-performance analytics

Redshift

AWS data warehouse
Cloud data warehousing

DB-API 2.0

Standard interface
Any PEP 249 connection

Custom Database Connections

SQLAlchemy

Ibis

DuckDB with Persistence

Clickhouse

Query Features

Referencing DataFrames

DuckDB can query any DataFrame in scope:

Reading Files

DuckDB can read various file formats directly:

Remote Files

Output Control

Disable Output Display

Output Format

Control the returned DataFrame type via config:
The output format is configured in marimo settings under SQLOutput type. Options: auto, polars, lazy-polars, pandas

Result Limits

Limit large query results automatically:
If a query result exceeds the limit, marimo displays a preview and notes the data is truncated.

EXPLAIN Queries

Analyze query execution plans:
For DuckDB, EXPLAIN output preserves box-drawing characters for readable query plans.

Advanced Features

Lazy Evaluation

For large datasets, use lazy evaluation:

DuckDB Extensions

Load DuckDB extensions for additional functionality:

Common Table Expressions (CTEs)

Window Functions

Database Catalog

marimo can discover database schemas, tables, and columns automatically for autocomplete and exploration.

Available Databases

View connected databases in the datasources panel:
  • Automatically detects database connections in scope
  • Shows schemas and tables
  • Provides column information

Autocomplete

When typing SQL queries, marimo provides intelligent autocomplete for:
  • Table names
  • Column names
  • SQL keywords
  • Functions

Best Practices

1

Use parameterization

Avoid SQL injection by using f-strings carefully, or use parameterized queries with SQLAlchemy.
2

Limit large results

Set MARIMO_SQL_DEFAULT_LIMIT or use LIMIT clauses to prevent loading huge datasets.
3

Index your data

For repeated queries on the same data, use DuckDB persistent databases with indexes.
4

Choose the right engine

  • DuckDB: Fast analytics on local/cloud files
  • SQLAlchemy: OLTP databases (PostgreSQL, MySQL)
  • Ibis: Unified API across multiple backends

Example: Complete Workflow

This workflow demonstrates loading data, transforming it with SQL, and visualizing the results - all with reactive updates.