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.
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.1.0a6
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.1.0a6.tar.gz | 422.7 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| deltaplan-0.1.0a6-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 568.7 kB
Release files / deltaplan-0.1.0a6.tar.gz
| Download URL | deltaplan-0.1.0a6.tar.gz |
|---|---|
| Size | 422.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
07434e793addad6222f186f3d1b6e8a823346492a7145b5730888b74af7539e4
|
|
BLAKE2b-256 checksum How to use checksums |
8d9b6acf760885a9a9741afd9329a61b47708a05c61a301cb2f3db02872e5d65
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.17 {"installer":{"name":"uv","version":"0.12.17","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.1.0a6-py3-none-any.whl
| Download URL | deltaplan-0.1.0a6-py3-none-any.whl |
|---|---|
| Size | 146.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
71ea3e0e5a83a5bcf6084f696e25405ebf17451d05e134f26a371e1b59f1e00d
|
|
BLAKE2b-256 checksum How to use checksums |
d6035722fe45383a3bd4fda49367b15101b5f0e965480920a5ff7c7a737a517d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.17 {"installer":{"name":"uv","version":"0.12.17","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}
|