跳转至

华为云 DWS 连接器

GaussDB(DWS) 是源自 PostgreSQL 的分布式数仓。Dosi 用标准 PostgreSQL 线协议驱动连接它;它不是 gaussdb 连接器,后者的私有 SHA256 认证需要另一套驱动。

DWS 最关键的特性是 pg_database.datcompatibility。每个数据库分别属于 ORATDMYSQL 模式,这个值会影响 SQL 语义。因此 Dosi 会先从实际连接的数据库解析模式,再编译 SQL,并把模式保留在编译结果中直到执行。

连接配置

datasources:
  warehouse-td:
    type: dws
    host: ${DWS_HOST}
    port: 8000
    database: ${DWS_DATABASE_TD}
    username: ${DWS_USERNAME}
    password: ${DWS_PASSWORD}
    schema: public
    sslmode: verify-full
    sslrootcert: /etc/ssl/certs/dws-ca.pem
    compat_mode: TD
配置项 类型 必填 默认值 含义
host string 是,除非配置 uri DWS Endpoint。
port int 8000 使用离散字段配置时的 DWS 服务端口。
database string 要探测兼容模式的数据库。
username / password string 通常是 PostgreSQL 线协议凭据,支持环境变量展开。
schema string public 会话的 search_path
sslmode / sslrootcert string prefer / 无 与 PostgreSQL 相同的 TLS 级别;校验模式必须提供 CA。
compat_mode ORATDMYSQL 自动探测 可选断言;与数据库不一致时会在编译前失败。
uri string 二选一 完整的 postgres://...:8000/... URI,需要包含端口;compat_mode 仍单独配置。

不要在运行时复用一个 profile 再切换 database。每个数据库使用一个具名 profile;成功探测到的模式只缓存在该 profile 内,因此 TD 数据库不会污染 ORA 数据库的编译上下文。

兼容模式

Dosi 会通过所选连接执行下面这条原样查询:

SELECT datcompatibility
FROM pg_database
WHERE datname = current_database();

值未知或不可读都会直接失败。按 dws_oradws_tddws_mysql 编译的 SQL,只允许交给解析出相同模式的执行器。目前三个模式共用 PostgreSQL 兼容的 renderer,但模式已经成为显式编译输入;后续增加经过验证的模式专属 lowering 时,不需要再改 API,也不会发生跨数据库复用。

不连接数据库、只编译 SQL 时,必须显式给出模式:

dosi --model model.yaml query --metrics revenue --dialect dws --dws-mode td

执行时应使用具名 profile,让 Dosi 从实际数据库探测模式:

dosi --model model.yaml query --metrics revenue --execute --connection warehouse-td

验证

声明式 corpus 与其他数仓共用模型、seed、查询和期望结果。DWS 有三个独立执行目标:dws_oradws_tddws_mysql。每个目标分别维护 epoch、SQL gold、receipt 和云测试任务,因此一个模式通过不会被当作另外两个模式也已支持。

为兼容 DWS 8.2.1,corpus 初始化不会使用 CREATE SCHEMA IF NOT EXISTS (该语法从 DWS 9.1 才开始支持)。corpus fixture 中的物理表引用固定为 main.<table>,因此三个模式数据库都必须预先存在可写的 main schema。 云测试工作流固定设置 DWS_SCHEMA=main;testkit 会拒绝其他值,避免在一个 schema 初始化数据、却去另一个 schema 查询。这个约束只适用于 corpus,普通 DWS 连接 profile 仍可使用任意已存在的 schema。

相关内容