You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit 2f9e601
Browse filesBrowse the repository at this point in the historyBrowse files
docs(skills): document fork re-attach behavior and add fork-before-risky-changes workflow (#229)
* docs(skills): document fork connection re-attach, active-db side effect, and fork-before-risky-changes workflow
* docs(skills): reference source database by id in fork workflow; document set as id-only
* docs(skills): database selection is always by id — names and catalogs are not unique
* docs(skills): fork workflow — capture the fork id too; delete by fork id
---------
Co-authored-by: Eddie A Tejeda <669988+eddietejeda@users.noreply.github.com>
**Parquet only:**`databases tables load` accepts **parquet** files (local `--file`, remote `--url`, or a pre-staged `--upload-id`).
90
90
91
-
**Active database:**`hotdata databases set <id_or_description>` saves the active database to config. All `databases tables` subcommands and all `context` commands default to the active database; pass **`--database <id>`** to override per-command.
91
+
**Active database:**`hotdata databases set <id>` saves the active database to config. All `databases tables` subcommands and all `context` commands default to the active database; pass **`--database <id>`** to override per-command.
92
+
93
+
**Always select databases by id** (`dbid...`, from `databases list`). Display names and catalog aliases are not unique — several databases can share a name, and a fork answers to the same catalog as its source — so name-based selection is ambiguous.
92
94
93
95
```
94
96
hotdata databases list [--workspace-id <workspace_id>] [--output table|json|yaml]
-`list` — all managed databases in the workspace. Active database is marked with `*` under the DEFAULT column; CREATED shows when each database was made.
118
120
-`create` — creates a new managed database. `--name` is an optional human-readable display name. `--catalog` sets the SQL alias used in queries (`SELECT … FROM <catalog>.schema.table`); must be `[a-z_][a-z0-9_]*`. `--expires-at` accepts relative durations (`24h`, `7d`, `90m`) or an RFC 3339 timestamp; omitting means no expiry. Repeat `--table` to declare tables up front.
119
-
-`fork` — creates a new managed database that is an independent deep copy of an existing one (same schemas, tables, and data); the source is left unchanged and the two diverge freely afterwards. The source defaults to the active database; pass `<id_or_name>`(id, catalog, or name) to fork another. `--name` defaults to `<source>-fork` (so the two stay distinguishable in `list`); `--expires-at` accepts a relative duration or RFC 3339 timestamp, and when omitted a still-future source expiry is carried over. The fork becomes the active database on success. The fork answers to the **same catalog alias** as its source inside its own scope; indexes are **not** carried over. Only databases created with the current (DuckLake) storage engine can be forked — older parquet-backed databases return an error.
120
-
-`set` — saves `<id_or_name>`as the active database. Subsequent `databases tables` and `context` commands use it automatically.
121
+
-`fork` — creates a new managed database that is an independent deep copy of an existing one (same schemas, tables, and data); the source is left unchanged and the two diverge freely afterwards. The source defaults to the active database; pass the database `<id>` to fork another. `--name` defaults to `<source>-fork` (so the two stay distinguishable in `list`); `--expires-at` accepts a relative duration or RFC 3339 timestamp, and when omitted a still-future source expiry is carried over. The fork becomes the active database on success. The fork answers to the **same catalog alias** as its source inside its own scope; connection catalogs attached to the source are **re-attached** to the fork, but indexes are **not** carried over. Only databases created with the current (DuckLake) storage engine can be forked — older parquet-backed databases return an error.
122
+
-`set` — saves the database **id**as the active database. Subsequent `databases tables` and `context` commands use it automatically. Note that a successful `fork` also updates this: the fork becomes the active database.
121
123
-`unset` — clears the active database from config.
122
-
-`<id_or_name>` — inspect one database (id, catalog, name, expires_at).
124
+
-`<id>` — inspect one database (returns id, catalog, name, expires_at).
123
125
-`delete` — removes the managed database; clears the active-database config if it matched.
124
126
-`load` (top-level shorthand) — loads parquet into `--catalog.--schema.--table`. Accepts `--file`, `--url`, or `--upload-id`. If the table was not declared at create time, the CLI automatically deletes and recreates the database with the table declared, then retries the load.
125
127
-`tables list` — lists tables with `TABLE` (`<catalog>.<schema>.<table>`), `SYNCED`, `LAST_SYNC`. Uses active database when `--database` is omitted.
> Auto-declaring a *new* table recreates the database (no add-table API), which **changes its `id`**. Always reference a managed database by its **catalog** (stable), not the `id` returned by `databases create`— that id goes stale after the next `load` of an undeclared table. Declare tables up front (`databases create --table orders --table customers`) to avoid the recreate.
124
+
> Auto-declaring a *new* table recreates the database (no add-table API), which **changes its `id`** — the id returned by `databases create` goes stale after the next `load` of an undeclared table. Declare tables up front (`databases create --table orders --table customers`) to avoid the recreate, and don't cache ids across loads: re-read the current id from `databases list` at time of use. (Selection is still always by id — names and catalogs are not unique.)
125
125
126
126
3. Confirm and query:
127
127
@@ -132,6 +132,19 @@ A `hotdata query` runs inside **one** managed database; its scope sees that data
132
132
133
133
For **Chain** materializations into managed databases, see **`hotdata-analytics`**.
134
134
135
+
### Workflow: fork before risky changes
136
+
137
+
Before destructive experimentation (bulk replaces, schema rework, testing a load pipeline), fork the database and experiment on the copy — the source stays untouched and the two diverge freely:
138
+
139
+
```bash
140
+
hotdata databases list # note the source database id (dbid...)
141
+
hotdata databases set<source_id># source to protect (`set` takes an id)
142
+
hotdata databases fork --expires-at 24h # deep copy; becomes the active database — note the fork id it prints
**Capture both ids.** After the fork, both databases answer to the same catalog alias (here `sales`), so ids are the only unambiguous way to refer to either one — the source id comes from `databases list` up front, the fork id from the `fork` output. The shared alias means experimental SQL runs unchanged against the fork. Attached connections are re-attached to the fork; indexes are not carried over. When done, keep the fork (`databases set <source_id>` to switch back to the source) or delete it (`databases delete <fork_id>`). Only DuckLake-backed databases can be forked — see `fork` in the main skill for details.
0 commit comments