跳转至

可选的 SQL 策略扩展

Dosi 可以独立使用,也可以绑定请求级 SQL 策略实现。公开 Dosi 不依赖具体策略包。 配置了策略实现的请求必须成功加载并校验该实现;失败时拒绝编译和执行。

原生 CLI

安装与 Dosi 操作系统和 CPU 架构一致、实现 dosi_policy_plugin_v1 的可信动态库。 通过 dosi info --format json 查看原生 ABI 和 SQL AST schema 版本。 Python 扩展文件不能作为 CLI 策略动态库使用。

# connections.yaml
datasources:
  warehouse:
    type: duckdb
    uri: data.duckdb
    default: true
sql_policy:
  library: plugins/libpolicy.so
  config: policy.yaml
  context: request.json

sql_policy.library、config 和可选的 context 路径相对于 connections 文件解析。 macOS 使用 .dylib,Windows 使用 .dll。配置与上下文是由具体策略实现解释的 YAML/JSON 对象;身份认证与角色管理由可信宿主负责。

dosi --model model.yaml --connections connections.yaml \
  query --metrics revenue --execute

也可以使用 --policy-library、--policy-config、--policy-context-file,或对应环境变量 DOSI_POLICY_LIBRARY、DOSI_POLICY_CONFIG、DOSI_POLICY_CONTEXT。 需要策略保护时,即使没有 --execute,编译也会打开选中的执行连接来读取元数据。

指标、明细、归因查询均使用受保护的编译接口,并在执行前验证绑定凭据。 策略实现接收完整 lowering 后的 SQL AST,可保护独立生成的子查询读取。 通用宿主不会对返回结果再次应用策略。

Python 宿主

policy、policy_required 参数按请求传入。策略实现可提供 bind_execution_host(host), 绑定 Dosi 实际使用的原生执行连接。宿主提供 context_json(连接提示)、target、 metadata_query(sql)(返回 JSON 对象行)和 verify_context();实际命名空间捕获、 物理表和列解析由策略实现负责。

指定连接的编译、执行、明细和归因查询均会先重新绑定策略。只编译的实现可提供 for_compilation();没有执行连接且无法安全获取元数据时,应拒绝编译。 没有策略时不加载实现、不进行策略元数据查询。POLICY_EXECUTION_HOST_VERSION 用于声明这一可选绑定能力。

实现策略扩展

dosi-policy-api 定义通用 Rust 接口、原生 ffi 模块和可选 dynamic 加载器。 公开宿主不包含私有依赖,包括可选 Cargo 私有依赖;策略实现可以单独分发。

原生 ABI v1 使用兼容 C 的结构体和带版本的 JSON。输入和宿主回调只在一次同步调用 内借用,不能保留。响应缓冲区必须由生产方提供的函数释放且只能释放一次。 动态库是可信原生代码;宿主在所有请求作用域释放后才卸载动态库。 ABI 或 AST schema 不匹配时,在绑定前拒绝加载。

元数据回调使用最终执行器执行内部元数据 SQL,避免重新进入策略改写。 策略实现负责验证命名空间变化,并通过该连接解析原生列元数据。 SQLite 存储提供只读的原生 SQLite 元数据连接以保留声明类型,业务 SQL 仍通过 DuckDB SQLite 扩展执行。