Skip to main content

dbt-altertable

CI PyPI version Python versions License: MIT

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() and dbt.source() load the whole relation into memory as a pyarrow.Table.
  • Return anything pyarrow.table() accepts: pyarrow, pandas, polars or a DuckDB relation.
  • Run SQL with session.cursor().execute(sql).table, which returns a pyarrow.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:

  • indexes config
  • Contract constraints other than not_null (primary_key, unique, foreign_key, check)
  • grants config
  • external and table_function materializations
  • partitioned_by and sorted_by on 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)

Source distribution for dbt-altertable 0.2.14
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)

Table of built distributions (wheels) for dbt-altertable 0.2.14
File Interpreter ABI Platform Actions
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 log

Release 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 log

Security 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.

Select from 2 files

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 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.

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