feat: add database= parameter to sql engine and editor for managed database scoping#8
Conversation
…tabase scoping Pass database= to client.execute_sql() so queries are scoped to a managed database via the X-Database-Id header (hotdata-runtime>=0.2.1). - HotdataMarimoEngine: add default_database= constructor param, pass to execute() - SqlEditor: add database= constructor param, pass to both execute_sql calls - ManagedDatabaseWriter: use description= kwarg matching ManagedDatabase v0.2.0 API - Fix test_databases_marimo.py syntax error and update assertions
| options = {db.description or db.id: db.id for db in dbs} | ||
| value = current if current in options.values() else next(iter(options.values())) |
There was a problem hiding this comment.
nit: (not blocking) two subtleties here worth a quick check:
-
Dropdown value semantics changed from name to id. Previously
database.valuewas the database name; now it's the id. That id is then passed positionally toload_managed_table(database, ...)in_maybe_load(line 189). Worth double-checking that hotdata-runtime 0.2.1'sload_managed_tableaccepts the id as the first arg (vs. the old name) —test_managed_database_writer_loads_parquetstill assertsload_managed_table.assert_called_once_with("sales", ...)and only passes because the dropdown is mocked, so it doesn't actually validate the new behavior. -
Description collisions silently collapse. Two managed databases with the same description (or both unset, falling back to
db.idwhich is unique — that case is fine) collapse to a single dropdown entry because dict keys must be unique. Probably rare, but consider disambiguating, e.g.{(db.description or db.id) if uniq else f"{db.description} ({db.id})": db.id for ...}or just including the id in the label unconditionally.
…remove dead code - table_browser: extract _set_table_pick() replacing duplicate _init/_rebuild methods; _sync_table_catalog returns bool so ui drops _rebuilt_table_pick_this_run flag; standardize _active_connection_id to use 'or None' consistently - sql_engine: unregister now restores original engine_to_data_source_connection and resets sentinel so register/unregister/register round-trip works correctly - sql_editor: remove dead 'or ""' on _cached_sql (already guarded by None check above) - workspace_selector: cache HotdataClient, only reconstruct when workspace_id changes
…t param
When options is a dict {label: value}, Marimo validates value= against the
dict keys (labels), not the values. _rebuild_database_pick was passing a
database ID (dict value) which raised ValueError on startup. Now resolves
the label key corresponding to the previously-selected ID instead.
Summary
default_database: str | None = NonetoHotdataMarimoEngine.__init__, passed toexecute_sql()somo.sqlqueries are scoped to a managed database via X-Database-Id headerdatabase: str | None = NonetoSqlEditor.__init__andsql_editor()factory, passed to bothexecute_sqlcalls (run and rerun paths)ManagedDatabaseWriterto usedescription=kwarg forcreate_managed_database(matchesManagedDatabaseAPI from hotdata-runtime v0.2.0)hotdata-runtimedependency to>=0.2.1to pick up thedatabase=support and X-Database-Id header fixtest_databases_marimo.pysyntax error from corrupted duplicate function and updatescreate_managed_databaseassertion to usedescription=kwarg