工作区让数据库们加入同一场对话,却不会请它们共用一把牙刷。
1. 动机
没有一个所有者时,模式设置发生在迁移脚本中,提供商客户端住在全局变量里,CLI 选择另一套配置,MCP 服务器又悄悄打开第二份副本。每个部件单独工作,应用却失去了统一身份。HeavenBase 工作区把一个稳定 id 绑定到规范 Entity 类、命名 Backend 实例、字段放置、行与查询服务、固定元数据实体、请求的 Extension 根和智能体工具。所属上下文 (Context) 提供机器配置、模块解析与持久工作区注册。
这很重要,因为一个逻辑行可以跨越 SQL、向量、搜索、图或文件提供商,应用代码却仍需要一个地方来注册、写入、查询、检查和解释它。
2. 创建或以兼容方式重新打开持久工作区
HeavenBase("shop", ...) 在持久身份层面是幂等的。它会创建并注册缺失工作区,或打开已有的兼容定义。它绝不会隐式激活工作区。
显式 preset= 或 backends= 是构造断言。与已存构造冲突时会抛出 FileExistsError。两者都省略时,已有 id 会复用持久构造,而不是重新解释今天的默认值。
希望缺失成为错误时使用 load():
HeavenBase.load("shop") 要求工作区已经注册,缺失时抛出 KeyError。无名称 load() 先检查活跃选择,再检查配置默认值;它绝不会把创建工作区作为副作用。
3. 把隔离绑定到 Context
hb.DEFAULT_CONTEXT 只是未绑定调用的便利所有者。
稳定工作区 id 也会派生其配置层:shop 把 heavenbase.shop 覆盖在基础 heavenbase 配置上。发生实质配置变更后,如果已构建资源必须看到新快照,请重新打开工作区。
4. 从预设或显式后端开始
debug 预设不需要外部服务:
main 与 vec 等 Backend 键是工作区局部名称。每个 type 都通过 Context 解析一条规范 backend_type 记录。就绪 Backend 实例使用相同身份契约;进程重启后,重建需要兼容的实时实例或显式替换配置。
5. 在行 CRUD 前注册模式
register() 建立规范 Entity 类、解析放置、确保物理模式,并发布 MetaSchema 行。普通 upsert、set、delete、get、exists、count、ids 与 rows 只能操作已经存在的规范类。它们绝不会把创建模式变成隐藏副作用。
每一行都有稳定 object_id。如果数据行省略它却提供 name,HeavenBase 会从 Entity 模式与该名称派生确定性标识符。
6. 通过一个逻辑界面查询
hb.Query 值。execute() 重新计算并返回分离的 ResultFrame;请使用 rows()、scalar() 或类型化 dataframe 导出等显式出口。
工作区解析放置、已注册操作、处理器与提供商执行。explain() 报告真实的原生、适配器、扫描、回退或不支持路线,而不会把模块标签当作证明。
7. 检查基础实体与扩展
Catalog 与 MetaSchema 是固定且不可替换的工作区基础实体。Catalog 描述具体对象;MetaSchema 描述规范模式、字段、放置、活跃 Extension 与安全的 Registry 支持元数据。
8. 导出可重建外壳,而不是数据
工作区清单版本 2 存储一个construction 封装、请求的可选 Extension 根与用户 Entity 模式:
preset= 或 backends= 值替换可重放构造,但不会递归合并部分 Backend 设置。
9. 主动选择分离生命周期
load() 找到。分离是一种生命周期策略,不是存储承诺。它不代表临时或隔离数据,清理也不会自动发生。
release() 从所属 Context 的实时查找中移除持久工作区外观,同时保留 Backend 数据。drop() 是破坏性物理数据操作。请保留正确外观,并显式调用这些方法。
10. 了解协调边界
一个实时工作区会串行化其公共模式、CRUD、查询、刷新、修复、释放与删除操作。独立路由 Backend 仍不会形成分布式事务或跨进程序列化边界。失败的多后端写入可能需要显式审计与收敛。 使用ws.audit() 检查 Catalog 一致性,并在有意修复前使用 ws.repair(dry_run=True)。承诺提供商原生行为前先使用 Query.explain()。
摘要
- 工作区拥有 schema、放置、行、路由与附属领域 API。
- 持久构造、加载、激活与 detached 生命周期是独立决定。
- 清单重建外壳;Backend 与应用拥有物理数据保证。

