This release is a pre-release and may not be stable for production use.
deltaplan △
Declarative plan / apply for Databricks SQL tables.
Describe your Unity Catalog tables in YAML, diff that against the live catalog,
review a plan that knows which Delta changes are free and which rewrite 400 GB —
then apply it.
Status: alpha. Every milestone in the design is built — plan, apply (rewrites included), drift, the GitHub Action, and governance (tags, grants, masks, row filters, views, SQL functions). It is tested offline against a fake warehouse, and every assumption it makes about Databricks is checked by a live suite against a real workspace. Try it on a dev catalog before production.
uv tool install --prerelease allow deltaplan # or: pip install --pre deltaplan
Get started → — install, import a schema, plan, apply: ten minutes on your own workspace.
Take the tour → — one project from
nothing to a reviewed pull request, every step shown — or browse the
feature gallery. The
docs have the spec format, the commands, and
the safety model. docs/DESIGN.md is the source of truth.
The spec
table: ${catalog}.sales.orders
comment: Order facts
cluster_by: [order_date]
columns:
- name: order_id
type: bigint
nullable: false
- name: customer_ref
type: string
renamed_from: cust_id
- name: address
type:
struct:
- {name: street, type: string}
- {name: zip, type: string}
Or as SQL — the same model, read with sqlglot:
CREATE TABLE ${catalog}.sales.customers (
customer_id BIGINT NOT NULL,
name STRING,
CONSTRAINT customers_pk PRIMARY KEY (customer_id)
)
CLUSTER BY AUTO;
A project can mix both. SQL specs support what sqlglot can parse; YAML supports everything — the list says which.
The plan
Why
- Delta-aware. Metadata-only, needs-a-table-feature, and full-rewrite are different things, and the plan says which one you're about to do — before you do it.
- Safe by default. Only tables deltaplan manages are ever drop candidates;
everything else is reported as unmanaged and left untouched. Destructive steps need
--allow-destructive, and a stale plan is refused. - No state file. Unity Catalog is the state.
- Nested types are first class. Struct, array and map fields diff by path
(
address.element.zip), including renames and per-field comments. - Reviewable. The plan is a data structure; the terminal, Markdown (for PR comments) and JSON renderers all read the same object.
- At home next to an Asset Bundle. Your
databricks.ymlalready has the targets, the workspaces, the variables and often the schema. deltaplan asks the Databricks CLI what they resolve to — lookups, development renaming and all — names the schema the way the bundle does, and leaves what the bundle declares to the bundle — details.
Commands
deltaplan validate -t dev # spec lint, no connection needed
deltaplan import main.sales -o tables # live tables -> YAML specs
deltaplan apply -t dev # plan, show, ask, run
deltaplan plan -t dev [-o plan.json] [--select sales.orders] [--format rich|md|json]
deltaplan show plan.json -f md # render a saved plan, no warehouse needed
deltaplan apply plan.json [--allow-destructive] # run a reviewed plan, as CI does
deltaplan drift -t dev # exit code 2 on drift, for CI
deltaplan force-unlock -t dev
In CI
- uses: misja-pronk/deltaplan@v0
with:
target: prod # comments the plan on the pull request
Plan on pull requests, apply on merge, catch drift nightly — see the CI guide.
Development
deltaplan uses mise + the Astral stack (uv, ruff, ty).
mise install # pinned Python + uv
uv sync # .venv with deps and dev tools
mise run check # lint + format check + types + unit tests
mise run test # uv run pytest tests/unit
mise run docs # preview the docs at localhost:8000
See CONTRIBUTING.md for the architecture and the house rules.
License
Apache-2.0 — see LICENSE.
Metadata
Release files for deltaplan 0.2.0a2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| deltaplan-0.2.0a2.tar.gz | 481.0 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| deltaplan-0.2.0a2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 653.2 kB
Release files / deltaplan-0.2.0a2.tar.gz
| Download URL | deltaplan-0.2.0a2.tar.gz |
|---|---|
| Size | 481.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
8448f45601d3306c46f8aaa4999d6225aafe417a79cd8ceb5cf439392f717837
|
|
BLAKE2b-256 checksum How to use checksums |
f525c6986c4507fce2145f533f1845e26c33b8a13967e8f0db19f55ea4be7fbc
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.18 {"installer":{"name":"uv","version":"0.12.18","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / deltaplan-0.2.0a2-py3-none-any.whl
| Download URL | deltaplan-0.2.0a2-py3-none-any.whl |
|---|---|
| Size | 172.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
f5fa152132d6e49e2d7bcc2be4654af2ab1278ef7d7a45f5e2bb5f798161060d
|
|
BLAKE2b-256 checksum How to use checksums |
ba2c27bdc8654c3d82e80259cdf16ee2b5dd1d97ef484186f9bb836f5452e780
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.18 {"installer":{"name":"uv","version":"0.12.18","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|