Skip to main content
A table is a schema plus an index spec: which columns are full-text- and vector-indexed (see Indexing). Create it once, then append rows.

Create and append

One append == one atomic commit, durable on return. Append in batches rather than row-by-row for throughput.

Open an existing table

A table persists, so you create it once and open it on later runs with open_table.

Update and delete

In Python and Node.js, update and delete match rows by a SQL predicate string. In Rust, they take a DataFusion Expr (col(...).eq(lit(...))), where col and lit come from the datafusion-expr crate (see the Quickstart for the companion crates Rust needs). update replaces matched rows 1:1 with the new rows you supply.
update and delete require durable storage: a path or s3:// URI, not memory://. update is 1:1, so the matched row count must equal the replacement count.

Compact, list, and drop

optimize accepts options (omit for engine defaults):

Reclaim storage (gc)

Compaction and interrupted writes can leave behind storage objects that the table no longer references. gc deletes them and reports what it reclaimed. It only removes objects older than a grace window (in seconds), so it never races a concurrent reader or writer; requires durable storage.
optimize already runs a best-effort gc after compacting, so calling gc directly is mainly for reclaiming on a schedule or after bulk deletes.

Limitations

  • One writer per table at a time. Appends/updates/deletes are serialized through a single atomic commit (concurrent writers from other processes retry).
  • update is 1:1. The matched row count must equal the replacement-row count.
  • update / delete need durable storage, not memory://.
  • Schema is fixed at creation. Adding or changing columns means a new table.

See also

Last modified on July 6, 2026