Skip to main content

Wren Engine CLI and Python SDK — semantic SQL layer for 20+ data sources

Project description

wrenai

PyPI version Python License

Wren AI CLI and Python SDK — semantic SQL layer for 20+ data sources.

Translate natural SQL queries through an MDL (Modeling Definition Language) semantic layer and execute them against your database. Powered by Apache DataFusion.

Installation

pip install wrenai              # Core (DuckDB included)
pip install wrenai[postgres]    # PostgreSQL
pip install wrenai[mysql]       # MySQL
pip install wrenai[bigquery]    # BigQuery
pip install wrenai[snowflake]   # Snowflake
pip install wrenai[clickhouse]  # ClickHouse
pip install wrenai[trino]       # Trino
pip install wrenai[mssql]       # SQL Server
pip install wrenai[databricks]  # Databricks
pip install wrenai[redshift]    # Redshift
pip install wrenai[spark]       # Spark
pip install wrenai[athena]      # Athena
pip install wrenai[oracle]      # Oracle
pip install 'wrenai[memory]'    # Schema & query memory (LanceDB)
pip install 'wrenai[ui]'        # Browser-based profile form (starlette + uvicorn)
pip install 'wrenai[main]'      # memory + interactive prompts + ui
pip install 'wrenai[all]'       # All connectors + main

Requires Python 3.11+.

Quick start

1. Initialize a project — scaffolds a YAML-based MDL project:

mkdir my-project && cd my-project
wren context init

This creates wren_project.yml, models/, and views/. Edit wren_project.yml to set your data_source and add models under models/:

# wren_project.yml
schema_version: 2
name: my_project
catalog: wren
schema: public
data_source: postgres
# models/orders/metadata.yml
name: orders
table_reference:
  schema: mydb
  table: orders
columns:
  - name: order_id
    type: integer
  - name: customer_id
    type: integer
  - name: total
    type: double
  - name: status
    type: varchar
primary_key: order_id

Already have an MDL JSON? Import it directly: wren context init --from-mdl path/to/mdl.json

2. Configure a connection profile:

# Browser form (recommended, requires wrenai[ui])
wren profile add my-db --ui

# Interactive terminal prompts
wren profile add my-db --interactive

# Import from an existing connection file
wren profile add my-db --from-file connection_info.json

3. Build the manifest:

wren context build

This compiles YAML files into target/mdl.json. The CLI auto-discovers this file when you run queries from within the project directory.

4. Run queries:

wren --sql 'SELECT order_id FROM "orders" LIMIT 10'

wren walks up from the current directory to find wren_project.yml and uses target/mdl.json. You can also pass --mdl path/to/mdl.json explicitly.

For the full CLI reference and per-datasource connection field reference, see docs/cli.md and docs/connections.md.

4a. (Optional) Aggregation queries with cubes — define cubes under cubes/, then query them with a structured input instead of writing GROUP BY SQL by hand:

wren cube list
wren cube describe order_metrics
wren cube query --cube order_metrics --measures revenue --time-dimension "created_at:month"

The translator produces DATE_TRUNC / GROUP BY / WHERE clauses for you and runs them through the same engine path as wren --sql. See the Cube guide for full YAML structure and the CLI reference for all flags.

5. (Optional) Configure security policy — create ~/.wren/config.json:

{
  "strict_mode": true,
  "denied_functions": ["pg_read_file", "dblink", "lo_import"]
}
Key Default Description
strict_mode false When true, every table in a query must be defined in the MDL. Queries referencing undeclared tables are rejected before execution.
denied_functions [] List of function names (case-insensitive) that are forbidden in queries.

6. (Optional) Index schema for semantic search (requires wrenai[memory]):

wren memory index                              # index MDL schema
wren memory fetch -q "customer order price"    # fetch relevant schema context
wren memory store --nl "top customers" --sql "SELECT ..."  # store NL→SQL pair
wren memory recall -q "best customers"         # retrieve similar past queries

Connection profiles

Profiles let you store named connection configurations in ~/.wren/profiles.yml and switch between them easily — useful when working across multiple databases or environments.

# Add a profile (browser form, interactive prompts, or file import)
wren profile add prod --ui                        # opens http://localhost:<port>
wren profile add staging --interactive            # terminal prompts
wren profile add local --from-file conn.json      # import existing file

# List and switch profiles
wren profile list                                 # * marks the active profile
wren profile switch prod

# Inspect a profile (sensitive fields masked)
wren profile debug prod

# Remove a profile
wren profile rm old-profile --force

The --ui flag opens a browser-based form that auto-derives fields from each datasource's schema — including file upload for BigQuery credentials, variant selection for Databricks/Redshift, and sensible defaults for all 20+ supported sources. Requires pip install 'wrenai[ui]'.

Once a profile is active, wren uses it automatically:

wren profile switch prod
wren --sql 'SELECT COUNT(*) FROM "orders"'        # connects using prod profile

Python SDK

import base64, orjson
from wren import WrenEngine, DataSource

manifest = { ... }  # your MDL dict
manifest_str = base64.b64encode(orjson.dumps(manifest)).decode()

with WrenEngine(manifest_str, DataSource.mysql, {"host": "...", ...}) as engine:
    result = engine.query('SELECT * FROM "orders" LIMIT 10')
    print(result.to_pandas())

Development

just install-dev    # Install with dev dependencies
just lint           # Ruff format check + lint
just format         # Auto-fix
Command What it runs Docker needed
just test-unit Unit tests (engine, CTE rewriter, field registry, profiles) No
just test-duckdb DuckDB connector tests No
just test-postgres PostgreSQL connector tests Yes
just test-mysql MySQL connector tests Yes
just test All tests Yes

Profile web tests (test_profile_web.py) require wrenai[ui]:

uv sync --extra dev --extra ui --find-links ../wren-core-py/target/wheels/
uv run pytest tests/test_profile_web.py -v

Publishing

./scripts/publish.sh            # Build + publish to PyPI
./scripts/publish.sh --test     # Build + publish to TestPyPI
./scripts/publish.sh --build    # Build only

Package rename: wren-enginewrenai

Starting with the 0.7.0 release, this PyPI distribution is renamed from wren-engine to wrenai to align with the Wren AI brand. The legacy wren-engine project on PyPI is frozen at 0.6.x and will not receive further updates.

What stays the same

  • The Python import path: import wren (and submodules under wren.*)
  • The wren CLI entrypoint and every subcommand (wren query, wren context, wren profile, wren memory, …)
  • All extras (postgres, mysql, bigquery, …, memory, ui, main, all)
  • Configuration files under ~/.wren/ (profiles, memory, config)

Only the name you type after pip install is different.

Migration

pip uninstall wren-engine
pip install wrenai                  # or: pip install "wrenai[<extras>]"
wren --version                      # should print: wrenai X.Y.Z

If your project pinned wren-engine in a requirements.txt, pyproject.toml, or lockfile, replace it with wrenai and re-lock.

License

Apache-2.0

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

wrenai-0.7.0.tar.gz (366.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

wrenai-0.7.0-py3-none-any.whl (133.4 kB view details)

Uploaded Python 3

File details

Details for the file wrenai-0.7.0.tar.gz.

File metadata

  • Download URL: wrenai-0.7.0.tar.gz
  • Upload date:
  • Size: 366.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for wrenai-0.7.0.tar.gz
Algorithm Hash digest
SHA256 3e9c18051a40c7710743334e6f7859ab7efec67d81f75e343f9425f6355ec36b
MD5 c6d1ae48e91d00103474c57b368ae961
BLAKE2b-256 a474cc3c51b9148ca73311b002bc1d27971dd95b08448ab6ddf7e6a12925da96

See more details on using hashes here.

File details

Details for the file wrenai-0.7.0-py3-none-any.whl.

File metadata

  • Download URL: wrenai-0.7.0-py3-none-any.whl
  • Upload date:
  • Size: 133.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for wrenai-0.7.0-py3-none-any.whl
Algorithm Hash digest
SHA256 7b053158380ba4dd0a8836acff44393e87a49f15a53597bd4eae87eff5049c03
MD5 beb4c16cd86993cc08a1cc8a8762ef2e
BLAKE2b-256 3759b7634090f90ffe955890307f58f2cd58b750c0c05e6d85f8e10ebe88301e

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page