Skip to main content

SQLBuild

The refactorable warehouse. Verify early, test properly, and refactor safely.

Website · Docs · Quickstart · Roadmap

Change your warehouse as often as your code. SQLBuild brings compile-time checks, end-to-end tests and safe renames to your SQL, so change stops being risky. It is a free, open-source framework for SQL and Python data pipelines, and it keeps its state in append-only tables in your own warehouse: no external state database, no manifest files and no paid tier.

Its compiler and planner run in Rust. Warehouse execution and extensions use Python.

Moving and renaming an incremental model with sqb mv: sqb plan migrates the existing table instead of rebuilding it

Move an incremental model to a new folder and name with sqb mv, and sqb plan migrates its table instead of rebuilding it.

Quick start

pip install sqlbuild
sqb playground waffle-shop
cd waffle-shop
sqb plan
sqb build
sqb test

The playground runs on local DuckDB, with no warehouse credentials.

What it does

Catch mistakes before anything runs

  • Compile-time checks. SQLBuild resolves references, validates SQL, infers column types, checks contracts and computes column lineage, all offline. A typo'd column fails in seconds, not halfway through a warehouse run.
  • Your conventions as rules. Built-in and custom Python rules turn review comments into compile errors: for example, marts can't read sources directly, or every final model declares its key.

Prove it works

  • Tests across models. SQL tests mock the sources and check the result through every model in between, with macros as test helpers. Macro, UDF and table-function tests are built in.
  • End-to-end scenarios. Build the real graph against fixture data, capture fixtures from the warehouse, and replay them locally on DuckDB in CI. See scenarios.
  • Audits and diffs. Audits run before data reaches the target table, and data diffs compare dev against prod or any query.

Change it without rebuilding everything

  • Renames keep their history. sqb rename and sqb mv update every reference, and the next build migrates the existing table instead of rebuilding it. The old name keeps working through a compatibility view. sqb rename <model>.<column> renames an incremental model's column in place.
  • Replay on change. When a model's SQL changes, choose how far back to reprocess, from only the new data to the last 14 days to a full rebuild, with replay_on_change.
  • Macros don't have to be global. Keep macros, enums and constants next to the models that use them, and preview what a move would break with sqb scope. See declaration scopes.
  • Tidy up safely. The janitor archives stale tables before anything is deleted.

Find out what happened

  • Every run is recorded. Recall keeps each command's statements, SQL, audit results and exact output. Agents and people query it with SQL through sqb recall, then check live state in the warehouse with the same command. History stays in a SQLite file in the project, or in ClickHouse for a team.

Ingestion with Python loaders, and Python tasks, assets and checks, run in the same graph as your SQL models. See the docs for everything else.

In the terminal

Each demo is real output from the example projects in website/examples, running on local DuckDB.

A renamed column breaks the contract

daily_revenue declares contract enforced. Renaming waffles_sold to units_sold in the SELECT fails at compile time, before anything reaches the warehouse.

sqb compile fails because units_sold is not in the enforced contract and the declared waffles_sold column is missing

Both sides are reported: the new column isn't in the contract, and the declared one is gone.

Your own conventions as compile errors

Rules are Python functions in your project. This one, from rules/layers.py, says marts must read sources through staging:

from sqlbuild.rules import Finding, Model, RuleContext, rule


@rule(
    code="XSQBRARCH001",
    message="Marts must read sources through staging",
    remediation="Reference a staging model with __ref() instead.",
)
def marts_use_staging(*, model: Model, ctx: RuleContext) -> list[Finding]:
    layer = ctx.project.tree.relative_parts(path=model.path, under="models")[0]
    sql = ctx.sql.for_model(model).authored.source
    if layer != "marts" or "__source(" not in sql:
        return []
    line = sql[: sql.index("__source(")].count("\n") + 1
    return [ctx.finding(subject=model, line=line)]

A mart that reads __source("raw__payments") directly now fails, and so does the unit test that has no mock for it:

sqb compile reports the custom rule XSQBRARCH001 on the line that reads a raw source, and a unit test with no mock for that source

See rules.

See what a move would break

sqb scope --as-path previews moving a model before you move it.

sqb scope previews moving daily_revenue: the enum and macro it uses would be lost, so both usages are invalidated

Look at Lost and Invalidated usages: the model uses an enum and a macro that are private to models/marts, so moving it would break both.

Example

A model is a SQL file with a MODEL() header and a SELECT:

MODEL (
  description "One row per order",
  materialized table,
  columns (
    order_id (audits [not_null, unique]),
  ),
  tags [marts],
);

SELECT
  o.order_id,
  o.customer_id,
  p.amount_cents AS total_cents,
  @py.cents_to_dollars("p.amount_cents") AS total_dollars
FROM __ref("stg_orders") o
JOIN __ref("stg_payments") p USING (order_id)

Python macros are plain functions that return SQL, kept next to the models that use them; SQL macros in macros/sql/ cover logic-free fragments with typed, checked arguments:

# models/marts/_sqlbuild/_macros/python/currency.py
def cents_to_dollars(column: str) -> str:
    """Convert a cents integer column to a dollars decimal with two decimal places."""
    return f"ROUND(({column}) / 100.0, 2)"

A test mocks the sources and asserts on the model, resolving every model in between from its real SQL:

TEST();

WITH
__source__raw__orders AS (
  SELECT
    1 AS id,
    100 AS customer_id,
    2 AS waffle_type_id,
    3 AS quantity,
    CAST('2026-04-01 10:00:00' AS TIMESTAMP) AS ordered_at,
    'completed' AS status
),
__source__raw__payments AS (
  SELECT
    10 AS id,
    1 AS order_id,
    1500 AS amount_cents,
    'credit_card' AS payment_method,
    CAST('2026-04-01 10:05:00' AS TIMESTAMP) AS paid_at,
    'success' AS status
),
__expected__fact_orders AS (
  SELECT 1 AS order_id, 100 AS customer_id, 1500 AS total_cents, 15.00 AS total_dollars
)

Warehouses

Warehouse Status
Snowflake Supported
DuckDB Supported
MotherDuck Supported
PostgreSQL Supported
BigQuery Beta
Databricks Beta
SQL Server Beta

Snowflake is the main target. Beta adapters build, test and plan, but have had less production use so far. See adapters.

Free and independent

SQLBuild is Apache 2.0 and will stay free: no paid tier, no commercial edition, and no feature held back for one. Its state lives in your warehouse, next to your data. See the roadmap for what's next.

Contributing

Contributions are welcome. See CONTRIBUTING.md.

License

SQLBuild is licensed under the Apache License 2.0.

Metadata

Release files for sqlbuild-cli 0.171.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for sqlbuild-cli 0.171.0
File Size Uploaded Provenance
sqlbuild_cli-0.171.0.tar.gz 2.3 MB With provenance Details

Built distributions (wheels)

Table of built distributions (wheels) for sqlbuild-cli 0.171.0
File
sqlbuild_cli-0.171.0-py3-none-win_amd64.whl Python 3 none Windows x86-64 Details
sqlbuild_cli-0.171.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl Python 3 none Linux glibc 2.17+ x86-64 Details
sqlbuild_cli-0.171.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl Python 3 none Linux glibc 2.17+ ARM64 Details
sqlbuild_cli-0.171.0-py3-none-macosx_11_0_arm64.whl Python 3 none macOS 11.0+ ARM64 Details
sqlbuild_cli-0.171.0-py3-none-macosx_10_12_x86_64.whl Python 3 none macOS 10.12+ x86-64 Details

Total release size: 17.2 MB

Release files / sqlbuild_cli-0.171.0.tar.gz

Download URL sqlbuild_cli-0.171.0.tar.gz
Size 2.3 MB
Tags Source
SHA-256 checksum
How to use checksums
bd42ee975b1df39467e70f89bbde34772328c762ac4c45c5c91d5670417278f8
BLAKE2b-256 checksum
How to use checksums
0b988bc2e69e8492e054a01e9f57a533d4fc087c5e58ca7d99a88293fdba52d1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 23, 2026.

Transparency log

Release files / sqlbuild_cli-0.171.0-py3-none-win_amd64.whl

Download URL sqlbuild_cli-0.171.0-py3-none-win_amd64.whl
Size 2.3 MB
Tags Python 3 Windows x86-64
SHA-256 checksum
How to use checksums
7c62f7e51c07c657eac4f1fb85345b09613720ccf037b673ac4af28c24b1be02
BLAKE2b-256 checksum
How to use checksums
4653aae3321ce71d57ba6c5b563908d0e342f511a2ebb048cdc3a483d7a83ef3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 23, 2026.

Transparency log

Release files / sqlbuild_cli-0.171.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL sqlbuild_cli-0.171.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Size 5.9 MB
Tags Linux glibc 2.17+ x86-64 Python 3
SHA-256 checksum
How to use checksums
9667fa844f3c880287ac047bb70349088a3752fae376bfdba2d5efd76ba2abe9
BLAKE2b-256 checksum
How to use checksums
d1e951b83fefa4c32009fa155969cd06458782f88d85a43bb7fe2be1e210b4d0
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 23, 2026.

Transparency log

Release files / sqlbuild_cli-0.171.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl

Download URL sqlbuild_cli-0.171.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Size 2.3 MB
Tags Linux glibc 2.17+ ARM64 Python 3
SHA-256 checksum
How to use checksums
ee0cdabfac685589c2d347f3f57319d5ffdbd604b8c7f7f41316abcc1dcd2504
BLAKE2b-256 checksum
How to use checksums
b5ee3ae7529840d04f5c16f222fd2b03629e133b02c326a81789197926cc48e2
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 23, 2026.

Transparency log

Release files / sqlbuild_cli-0.171.0-py3-none-macosx_11_0_arm64.whl

Download URL sqlbuild_cli-0.171.0-py3-none-macosx_11_0_arm64.whl
Size 2.2 MB
Tags Python 3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
9a21c8b20a8223d264a0bfd30eec63c6eb591cc4b03975b74a65e658554b8390
BLAKE2b-256 checksum
How to use checksums
0f5853b00ff7307abf2a1015fb8ccb4bdff983b81e45eba7baa002ec28aea475
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 23, 2026.

Transparency log

Release files / sqlbuild_cli-0.171.0-py3-none-macosx_10_12_x86_64.whl

Download URL sqlbuild_cli-0.171.0-py3-none-macosx_10_12_x86_64.whl
Size 2.3 MB
Tags Python 3 macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
9b884e11800ca0ab1b460aed52bf984261b95a8d67e31ef93599602e3144659a
BLAKE2b-256 checksum
How to use checksums
1c00faa71dd835570bd3802f6ee0400ded2bada05f5a7dcac61ab7c26ef0191f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 23, 2026.

Transparency log

Security for sqlbuild-cli 0.171.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 6 files in this release have been uploaded with provenance metadata.

Select from 6 files

Attestation for sqlbuild_cli-0.171.0.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 23, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

0.171.0 This release

6 release files Full provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page