Skip to Content
We are live but in Staging 🎉
Data EnginesSQLCLIdodil data table

dodil data table — lifecycle

Manage tables. Create, inspect and drop them, browse the template catalog, and bind a table to a pipeline. Mirrors Tables & maintenance.

Persistent flag on the whole group: --bucket / -b.

These are SQL verbs, not a separate API. list, get and describe build one SQL statement and send it through dodil.tables.v1.Tables/Execute on the tables-gateway. There is no ListTables, GetTable, DescribeTable or ListPartitions RPC. Anything the typed subcommands don’t cover, you write as SQL and send with dodil data sql.

dodil data table create

dodil data table create [name] -b BUCKET [flags]
FlagShortTypeDefaultDescription
--description-dstring—Table description
--columns-json—string—JSON array of column descriptors
--partition-column—string list (repeat)[]Partition columns. Repeat for multi-column partitioning.
--merge-key—string list (repeat)[]Primary-key columns. Repeat for a composite PK. Drives keyed write routing.
CREATE TABLE events ( id BIGINT NOT NULL, user_id VARCHAR NOT NULL, occurred_at TIMESTAMP NOT NULL, event_type VARCHAR NOT NULL, payload JSON, PRIMARY KEY (id, user_id) ) PARTITIONED BY (event_type);

Column type is a SQL type string, not an enum. The CLI normalizes a few aliases (int/integer/long/int64 → BIGINT, string/text → VARCHAR, float/real → DOUBLE, bool → BOOLEAN, bytes → BLOB) and passes anything else through uppercased, so VECTOR(768), NUMERIC(18,2), VARCHAR(64) and TIMESTAMP(3) all work and keep their declared width. Full list: Data types.

--merge-key populates TableSpec.pk_columns. Omit it and the table has no primary key of its own: it receives a hidden _rowid key, and keyed UPDATE / DELETE / UPSERT on your columns are unavailable.

There is no --source or --pipeline-template-id flag. Pipeline-bound tables are a different command — see table pipeline create below.

dodil data table list

dodil data table list -b BUCKET

Runs SHOW TABLES. Returns the table names and each one’s primary-key columns:

table pk_columns audit_tags id clients id contacts id products id (4 rows)
dodil data table list -b kb-prod -o json | jq '.rows[] | .table'

dodil data table describe (and get)

dodil data table describe [name] -b BUCKET dodil data table get [name] -b BUCKET # alias — identical code path

Runs DESCRIBE "<name>". get is an alias of describe, not a lighter-weight metadata read — both execute the same statement and print the same thing.

column type nullable pk default id long false true name string true false industry string true false created_day long true false

Note the type column reports the stored vocabulary type (long, string, timestamp, json, …), not the SQL spelling you declared, with a declared width or precision appended: a VARCHAR(3) shows as string(3), a TIMESTAMP(3) as timestamp(3). A column created as INTEGER describes as long — INTEGER and BIGINT are both 64-bit.

dodil data table describe events -b kb-prod -o json | jq '.rows[] | select(.pk)'

For storage size, pending-write backlog, residency and rejected-row counters use GetDatabaseStats. See Tables & maintenance → Database catalog.

dodil data table delete

dodil data table delete [name] -b BUCKET

Runs DROP TABLE. Permanently removes the table and its storage. Does not cascade to a pipeline-bound table’s pipeline or its ingest rule; clean those up separately via the Pipelines API.

dodil data table templates

dodil data table templates [--search TEXT] [--label KEY=VALUE]

Browse the warehouse-compatible subset of the Scriptum template catalog — the templates you can pass to dodil data table pipeline create -t <id>. Server-side filtered to the table facet.

FlagTypeDescription
--searchstringFree-text match against name + description
--labelstring list (repeat)Filter by label key=value. Repeat for multiple — all must match (AND).

There is no --category flag on this subcommand; category filtering lives on the org-wide dodil data template list. The catalog is org-scoped — -b is inherited from the parent group and ignored here, so you can omit it.

# All warehouse-compatible templates dodil data table templates # Free-text search dodil data table templates --search invoice # Label filter dodil data table templates --label modality=pdf

The catalog with one-line descriptions lives at API Reference → Templates.

dodil data template list vs dodil data table templates — the top-level template list returns all templates across pillars and accepts --category; this Tables variant pre-filters to warehouse-compatible only and does not. Both are org-scoped.

dodil data table pipeline

dodil data table pipeline create [name] -b BUCKET -t TEMPLATE_ID [--folder-prefix PREFIX] dodil data table pipeline list -b BUCKET

Creates a pipeline-bound table: a Scriptum template owns the schema, and rows materialize as matching documents land in the bucket.

FlagShortDescription
--template-tTable pipeline template id (required) — see table templates
--description-dDescription
--folder-prefix—Only files under this prefix trigger the pipeline (default: all)
dodil data table pipeline create entities -b kb-prod \ --description "Auto-extracted entities + PII" \ -t entity_pii_extraction \ --folder-prefix intake/

This does not start ingesting. Creating the pipeline binds the template to a table; it does not create an ingest rule. Scope one at the pipeline as a separate, mandatory step — see Templates → Using a template. dodil data recipe install is the exception: it creates the collection and binds the rule.

dodil data table view-url

dodil data table view-url [name] -b BUCKET [--sql SQL] [--console-base ORIGIN]

Prints a console deep-link that opens the table’s spreadsheet editor. --sql pre-fills a statement — and auto-runs it if it’s read-shaped.

dodil data table view-url events -b kb-prod \ --sql "SELECT * FROM events WHERE event_type = 'purchase' LIMIT 100"

Large results spool

Any of these commands can return a spooled result instead of inline rows: above a size threshold the result is written to object storage and returned as a manifest of presigned GETs. The CLI prints

(result spooled to object storage: N rows across M part(s); re-run with a LIMIT or fetch the presigned parts)

rather than a table. Add a LIMIT, or pull the parts yourself. See Execute → Spooled results.

Operations with no typed subcommand

Each of these is a SQL statement — send it with dodil data sql -b BUCKET "<sql>".

OperationStatement
Add / drop / widen a columnALTER TABLE t ADD COLUMN … · DROP COLUMN … · ALTER COLUMN … SET DATA TYPE …
Clear a tableTRUNCATE TABLE t
Create a table from a queryCREATE TABLE t2 AS SELECT … (CTAS)
Replace a table atomicallyCREATE OR REPLACE TABLE t AS SELECT …
Secondary indexCREATE INDEX …
RestoreRESTORE TABLE t TO VERSION AS OF n — destroys writes made after that version, see Schema changes → RESTORE
Pin in memoryLOAD TABLE t / RELEASE TABLE t — see Performance & layout

There is no Materialize RPC — persisting a SELECT is CTAS, CREATE OR REPLACE, or INSERT … SELECT.