anofox_scenario
Git-ähnliches Branching für analytische Datenbanken. Hängen Sie isolierte What-if-Szenarien als Kataloge an, bearbeiten Sie sie mit gewöhnlichem SQL auf Copy-on-Write-Delta-Speicher, verzweigen Sie, vergleichen Sie und führen Sie sie wieder zusammen.
Maintainer: jrosskopf
Installation und Laden
INSTALL anofox_scenario FROM community;LOAD anofox_scenario;Beispiel
-- History as recordedCREATE TABLE sales_plan (region VARCHAR PRIMARY KEY, units INTEGER);INSERT INTO sales_plan VALUES ('EMEA', 1000), ('AMER', 2000), ('APAC', 500);
-- Branch a what-if world: two statements, then it's just SQLCALL scenario_create('aggressive_q4', 'push APAC hard');ATTACH 'aggressive_q4' AS q4 (TYPE scenario);
UPDATE q4.sales_plan SET units = 1500 WHERE region = 'APAC';DELETE FROM q4.sales_plan WHERE region = 'EMEA';
-- Both worlds coexist; the base is never writtenSELECT 'base' AS world, * FROM sales_planUNION ALLSELECT 'scenario', * FROM q4.sales_plan ORDER BY world, region;
-- Audit the changes, then promote themSELECT * FROM scenario_diff('aggressive_q4', 'sales_plan');SELECT * FROM scenario_merge('aggressive_q4');Über anofox_scenario
anofox_scenario bringt Git-ähnliches Branching in DuckDB-Datenbanken. Ein Szenario ist
ein angehängter Katalog (ATTACH 'name' AS s (TYPE scenario)) über Ihren vorhandenen
Tabellen: Lesezugriffe mischen die Basis mit dem Copy-on-Write-Delta des Szenarios
zur Laufzeit, und INSERT / UPDATE / DELETE / MERGE INTO / ON CONFLICT (jeweils mit
RETURNING) landen im Delta — die Basistabellen werden nicht verändert.
Drei Isolationsstufen: ein Live-Overlay (Standard), mode := 'materialized'
als Point-in-Time-Kopien sowie DuckLake-Basen, die über
AT (TIMESTAMP) auf den Erstellungszeitpunkt festgenagelt sind, für Zero-Copy-Snapshot-Isolation. Szenarien verzweigen voneinander
(from_scenario :=) und erben Änderungen, deklarierte Zeilenidentitäten und
Snapshot-Pins.
Eine Streaming-Diff-Engine (scenario_diff, scenario_diff_summary) prüft jede
Welt gegen ihren Ursprung oder eine andere Welt, und
scenario_merge(name, on_conflict := 'abort'|'ours'|'theirs') übernimmt ein
Szenario atomar in seine Basis — mit echten 3-Wege-Drift-Konflikten, wenn ein
Erstellungssnapshot existiert. Views werden innerhalb von Szenarien neu gebunden, alle Basisschemas
werden gespiegelt, und Tabellen ohne Primärschlüssel funktionieren entweder über
mit key_columns := deklarierte Identität oder über Bag-Semantik mit
Multiplizitätsverfolgung.
Szenario-Welten lassen sich mit tabellennamengesteuerten Erweiterungen kombinieren: zum Beispiel
prognostiziert ts_forecast_by('s.demand', ...) (anofox_forecast) eine What-if-
Welt direkt, ohne Kopien.
Die Erweiterung erfasst anonyme Nutzungstelemetrie (nur ein Hüllen-Ereignis
extension_loaded; niemals Tabellennamen, Schlüssel oder SQL). Deaktivieren mit
SET anofox_scenario_telemetry_enabled = false oder
DATAZOO_DISABLE_TELEMETRY=1; siehe TELEMETRY.md im Repository.
Hinzugefügte Funktionen
| function_name | function_type | description | comment | examples |
|---|---|---|---|---|
| scenario_create | table | NULL | NULL | |
| scenario_diff | table | NULL | NULL | |
| scenario_diff_summary | table | NULL | NULL | |
| scenario_drop | table | NULL | NULL | |
| scenario_freeze | table | NULL | NULL | |
| scenario_list | table | NULL | NULL | |
| scenario_merge | table | NULL | NULL | |
| scenario_merge_preview | table | NULL | NULL | |
| scenario_migrate | table | NULL | NULL | |
| scenario_refresh | table | NULL | NULL | |
| scenario_unfreeze | table | NULL | NULL |
Überladene Funktionen
Diese Erweiterung fügt keine Funktionsüberladungen hinzu.
Hinzugefügte Typen
Diese Erweiterung fügt keine Typen hinzu.
Hinzugefügte Einstellungen
| name | description | input_type | scope | aliases |
|---|---|---|---|---|
| anofox_scenario_telemetry_enabled | Enable or disable anonymous usage telemetry for anofox_scenario | BOOLEAN | GLOBAL | [] |
| datazoo_banner | Show the DataZoo feedback banner when an extension is loaded in an interactive terminal (at most once a day per extension). | BOOLEAN | GLOBAL | [] |