dbt-altertable
A dbt adapter for Altertable, backed by Arrow Flight SQL.
Requirements
- Python 3.10+
- dbt-core
>=1.8,<2.0
Installation
pip install dbt-altertable
Or with uv:
uv add dbt-altertable
Configuration
Add a profile to ~/.dbt/profiles.yml:
my_project:
target: dev
outputs:
dev:
type: altertable
username: your_username
password: your_password
database: your_database
schema: your_schema
host: flight.altertable.ai # optional, this is the default
port: 443 # optional, this is the default
tls: true # optional, this is the default
compute_size: XL # optional, server default if omitted
| Field | Required | Default | Description |
|---|---|---|---|
username |
yes | — | Altertable username |
password |
yes | — | Altertable password |
database |
yes | — | Target catalog name |
schema |
yes | — | Target schema name |
host |
no | flight.altertable.ai |
Flight SQL endpoint host |
port |
no | 443 |
Flight SQL endpoint port |
tls |
no | true |
Use TLS for the Flight SQL connection |
compute_size |
no | server default | Compute size for all queries of the run: XS, S, M, L, XL, 2XL, 3XL, 4XL |
SQL dialect
dbt models should use DuckDB-compatible SQL. Altertable executes queries via DuckDB, so all DuckDB SQL features and functions are available — see the DuckDB SQL reference.
Compatibility with dbt-duckdb
The adapter builds on dbt-duckdb: duckdb__ macros from your project and packages (dbt_utils, dbt_date, ...) are used automatically.
Incremental strategies
| Strategy | Notes |
|---|---|
append |
Inserts new rows. |
delete+insert (default) |
Deletes rows matching unique_key, then inserts. |
merge |
MERGE on unique_key with dbt-duckdb's merge_* configs; at most one UPDATE or DELETE action, no merge_returning_columns. |
microbatch |
Replaces each event_time batch; batches run one at a time. |
Partitioning and sort order
Table and incremental models accept partitioned_by and sorted_by, applied when the table is created or fully refreshed:
{{ config(materialized='table', partitioned_by=['year(event_at)', 'country'], sorted_by=['event_at']) }}
Python models
Python table and incremental models run in the dbt process.
dbt.ref()anddbt.source()load the whole relation into memory as apyarrow.Table.- Return anything
pyarrow.table()accepts: pyarrow, pandas, polars or a DuckDB relation. - Run SQL with
session.cursor().execute(sql).table, which returns apyarrow.Table.
Install packages in dbt's Python environment. Pandas indexes are not written: call reset_index() to keep a groupby key.
Unsupported on Altertable
These fail with an explicit error instead of silently producing a different model:
indexesconfig- Contract constraints other than
not_null(primary_key,unique,foreign_key,check) grantsconfigexternalandtable_functionmaterializationspartitioned_byandsorted_byon Python models
Persisting model and column descriptions
When you enable persist_docs, dbt writes model and column description values to the warehouse using DuckDB’s COMMENT ON TABLE / COMMENT ON COLUMN syntax (one statement per column so Arrow Flight SQL accepts each round-trip).
Enable it in dbt_project.yml or on a model:
models:
my_project:
+persist_docs:
relation: true
columns: true
After a successful dbt run, descriptions show up on duckdb_tables() / duckdb_columns() (and therefore in dbt docs generate / catalog metadata).
Development
This project is managed with uv and hatchling.
git clone https://github.com/altertable-ai/dbt-altertable.git
cd dbt-altertable
uv sync --extra dev
Common tasks (see Makefile):
make lint # ruff format + ruff check --fix
make typecheck # ty check
make test # pytest
make build # uv build (wheel + sdist)
Integration tests
Flight SQL integration tests (for example persist_docs) run against altertable-mock in CI: the workflow builds the mock from main, starts it with --user dbt_ci:dbt_ci_secret, then runs pytest tests/integration. The default matrix job runs unit tests only (pytest --ignore=tests/integration).
Locally — Testcontainers (requires Docker; installs testcontainers via the integration extra):
ALTERTABLE_USE_TESTCONTAINERS=1 make test
make test detects that flag, runs uv sync --extra dev --extra integration, sets TESTCONTAINERS_RYUK_DISABLED=true by default (Ryuk often hangs on Docker Desktop), then runs the full pytest suite.
Or run only integration tests:
uv sync --extra dev --extra integration
export TESTCONTAINERS_RYUK_DISABLED=${TESTCONTAINERS_RYUK_DISABLED:-true}
ALTERTABLE_USE_TESTCONTAINERS=1 uv run pytest tests/integration -v
Optional overrides: ALTERTABLE_MOCK_IMAGE (default ghcr.io/altertable-ai/altertable-mock:latest), ALTERTABLE_MOCK_BOOT_USER (default dbt_ci:dbt_ci_secret, passed as --user to the mock), ALTERTABLE_MOCK_WAIT_TIMEOUT (seconds to wait for Starting Flight SQL server in logs, default 180).
If dbt run fails against the published image (for example catalog or information_schema errors), build the mock from source and point tests at it: docker build -t altertable-mock:local . then export ALTERTABLE_MOCK_IMAGE=altertable-mock:local — CI builds from main for the same reason.
Real Altertable — set the same ALTERTABLE_TEST_* variables to your Flight endpoint, catalog, and schema; do not set ALTERTABLE_USE_TESTCONTAINERS.
Optional pre-commit hooks:
uv run pre-commit install --hook-type pre-commit --hook-type commit-msg
Releases
Releases are managed via release-please — every push to main updates a rolling release PR. Merging it bumps the version, updates CHANGELOG.md, tags the release, and triggers PyPI publishing via trusted publishing.
Credits
This adapter draws on the design of dbt-duckdb.
License
MIT — see LICENSE.
Metadata
Release files for dbt-altertable 0.2.14
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| dbt_altertable-0.2.14.tar.gz | 18.4 kB | With provenance | Details for dbt_altertable-0.2.14.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| dbt_altertable-0.2.14-py3-none-any.whl | Python 3 | none | any | Details for dbt_altertable-0.2.14-py3-none-any.whl |
Total release size: 42.2 kB
Release files / dbt_altertable-0.2.14.tar.gz
| Download URL | dbt_altertable-0.2.14.tar.gz |
|---|---|
| Size | 18.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
44dabec3f743c15db34a68cc5bc9210041adda9afdfb0dd4817f6e8c1af108e1
|
|
BLAKE2b-256 checksum How to use checksums |
2315198be08107ccf1a32a70c635f14d512ab8243ae0849b49c3be15a11b540a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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 29, 2026.
Transparency logRelease files / dbt_altertable-0.2.14-py3-none-any.whl
| Download URL | dbt_altertable-0.2.14-py3-none-any.whl |
|---|---|
| Size | 23.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
1a2b37bcf921b26f28f61e984f498bee1f4c7ec24d74c66ba200c8e10c613a95
|
|
BLAKE2b-256 checksum How to use checksums |
5a0a392490d727fbbc05c4c067e2fbe9b72e4ddb98a3ea63ceb076d08d2a5e8e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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 29, 2026.
Transparency logSecurity for dbt-altertable 0.2.14
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 2 files in this release have been uploaded with provenance metadata.
Attestation for dbt_altertable-0.2.14.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 29, 2026.
Transparency logA 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.