下载

接入数据库

以 Doris 配置为起点,查找全部 15 种数据库的连接示例、认证参数、同步模板和表筛选方式。

Cappy 连接数据库,将表结构、描述和示例数据行同步为上下文文件。Agent 读取这些文件理解数据,再通过对应连接执行 SQL,取得查询结果。

在项目根目录的 config.yaml 中配置 databases。本文先用 Doris 说明通用配置,再列出每种数据库的完整示例和对应参数,最后说明如何同步、检查文件和选择表。

支持的数据库

数据库type
Dorisdoris
StarRocksstarrocks
PostgreSQLpostgres
MySQLmysql
ClickHouseclickhouse
DuckDBduckdb
MotherDuckmotherduck
BigQuerybigquery
Snowflakesnowflake
Databricksdatabricks
SQL Servermssql
Fabricfabric
Redshiftredshift
Athenaathena
Trinotrino

通用参数

以下示例连接 Doris 的 internal Catalog,同步 analytics 库中的表,排除 tmp_ 开头的临时表:

config.yaml
databases:
  - name: warehouse
    type: doris
    host: doris.example.com
    port: 9030
    user: analytics_reader
    password: {{ env('DORIS_PASSWORD_YAML') }}
    catalog: internal
    database: analytics
    schema_name: analytics
    include:
      - analytics.*
    exclude:
      - analytics.tmp_*
    allow_listed_only: true
    templates:
      - columns
      - preview

地址、库名和账号都是示例值,需替换为自己的数据库信息。analytics_reader 表示已有且具备读取权限的数据库账号,Cappy 不会自动创建它。已有 databases 时,在同一个列表中添加连接,不要重复写顶层键。

所有数据库共用以下参数,连接地址和认证字段见数据库参数。

参数说明
name
必填
项目内用于识别连接的名称,例如 warehouse。为不同连接使用不同名称;同步命令通过它选择连接
type
必填
上表中的类型值;例如 PostgreSQL 填 postgres,SQL Server 填 mssql
include
可选,默认:[]
要同步的表匹配模式。为空时选择当前连接能够列出的全部表
exclude
可选,默认:[]
从已选中的表中排除匹配项,优先于 include
allow_listed_only
可选,默认:false
设为 true 时,SQL 只能访问此连接上下文中已同步的表
templates
可选,默认:[columns, preview]
每张表要生成的上下文文件。空列表也使用默认值
query_history_days
可选,默认查询最近 30 天
启用 query_history 后使用;填 0 也按 30 天处理,不能用于关闭历史读取
query_history_sql
可选
自定义查询历史 SQL,需返回 query_text 列;{days} 替换为查询历史的天数
query_history_exclude_patterns
可选,默认:[]
用不区分大小写的正则表达式排除历史 SQL
profiling
可选
统计文件的刷新策略,见数据统计
ai_summary
可选
AI 摘要的刷新策略,见AI 摘要

提供密码和 Token

示例用 env() 从运行环境读取凭据。Cappy 会先替换文本,再解析 YAML。为保留密码中的引号、反斜杠或换行,本文使用以 _YAML 结尾的环境变量,存放经过 JSON 字符串编码的值:

export DORIS_PASSWORD_YAML="$(python3 -c 'import getpass, json; print(json.dumps(getpass.getpass("Doris password: ")))')"

在安装了 Python 3 的环境中执行,按提示输入密码;输入不会显示。配置中使用 password: {{ env('DORIS_PASSWORD_YAML') }},不要再加外层引号。其他数据库的密码、Token 和私钥口令使用同样的方法,将变量名替换为对应示例中的名称。

执行同步和查询的环境都需要设置这些变量。凭据文件、数据库文件和私钥路径也必须能被相应进程读取;不要把本机路径直接当作服务器路径。

限制查询范围

include 和 exclude 决定哪些表进入上下文;allow_listed_only: true 进一步限制查询只能引用这些已同步的表。该检查同时适用于 Agent 生成的 SQL 和用户编辑后执行的 SQL,遇到范围外的表或无法安全解析的查询时会阻止执行。

启用后先完成同步,再发起查询。只向数据库账号授予所需的权限。Cappy 当前没有 exclude_columns 配置;若需要隐藏特定字段,应在数据库中提供仅含允许字段的视图,并将连接权限和同步范围限定到这些视图。

同步模板

templates 决定每张表生成哪些文件:

模板默认启用内容与使用条件
columns是字段名、类型、描述、行数及数据库提供的分区、聚簇或索引信息。行数统计可能执行查询
preview是示例数据行(最多 10 行),写入项目文件
query_history否表被查询的次数、常见关联表及历史 SQL;需要能读取相应查询历史
profiling否各字段的空值数量、不同值的数量、最小值、最大值和常见值等统计,可能扫描大量数据
ai_summary否根据表结构、描述、统计和示例数据行生成 AI 摘要,需要配置 CLI 使用的模型

只需要表结构、不想保存示例数据行时,明确写 templates: [columns]。省略 templates 或写 templates: [] 都会生成 columns 和 preview。cappy init 如果同时配置了模型,还会为连接加入 ai_summary;可在同步前调整。

如果使用旧配置,将 accessors 改为 templates,将模板名称 how_to_use 改为 query_history,并删除 description 这一项。表描述已并入 columns.md。删除模板配置不会自动移除以前生成的文件;不再需要这些内容时,也要删除对应旧文件。

查询历史

在已有连接中启用 query_history,即可将常见用法作为上下文。将下面这些字段添加到这条数据库连接的配置中:

query_history_days: 30
templates:
  - columns
  - preview
  - query_history
query_history_exclude_patterns:
  - 'SYSTEM\$'
  - '^SELECT CURRENT_SESSION\(\)'
  - '^SHOW '

Cappy 为 BigQuery、Snowflake、Databricks、PostgreSQL 和 Redshift 内置了读取查询历史的 SQL。PostgreSQL 读取 pg_stat_statements,需要启用扩展并授予读取权限;它记录的是累计统计,不会按 query_history_days 筛选时间范围。其他连接器需要自定义 query_history_sql 才能读取自己的审计表。没有可用历史时,生成文件会说明未找到历史记录。

例如,Snowflake 连接可通过自定义 SQL 只保留成功的查询:

query_history_days: 14
query_history_sql: |
  SELECT query_text
  FROM SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY
  WHERE start_time >= DATEADD(day, -{days}, CURRENT_TIMESTAMP())
    AND execution_status = 'SUCCESS'
    AND query_type = 'SELECT'
  LIMIT 10000

查询必须返回 query_text 列,连接账号需要相应系统表权限。query_history_exclude_patterns 在读取后过滤 SQL:只要匹配其中一个表达式,就排除该查询,终端会显示排除数量。停止读取历史时,从 templates 中移除 query_history。

数据统计

在连接中添加 profiling 模板,并按需要设置刷新周期:

templates: [columns, preview, profiling]
profiling:
  refresh_policy: interval
  interval_days: 7
参数说明
refresh_policy
默认:always
always:每次同步重新计算;interval:距上次计算满指定天数时刷新;once:仅在文件不存在时生成
interval_days
默认:7
仅用于 interval,最小为 1,单位为天

统计支持普通字段及数组、结构、JSON 等复杂类型;具体统计项取决于字段类型和连接器。大表可先只同步 columns、preview,再为需要分析分布的表启用统计。

AI 摘要

AI 摘要使用运行 cappy sync 的终端环境中的模型设置。例如,使用 OpenAI 时:

export CAPPY_LLM_PROVIDER='openai'
export CAPPY_LLM_MODEL='your-model-id'
export OPENAI_API_KEY='your-api-key'

将 your-model-id 和 your-api-key 换为供应商提供的实际值。CAPPY_LLM_PROVIDER 选择供应商,CAPPY_LLM_MODEL 指定摘要模型,认证使用该供应商的环境变量。这些设置与 Web 的组织 LLM 配置分别生效。

再在数据库连接中启用摘要,下面的字段属于该连接:

templates: [columns, preview, ai_summary]
ai_summary:
  refresh_policy: interval
  interval_days: 7

摘要使用与 profiling 相同的刷新参数,默认每次同步重新生成。即使未生成 profiling.md 或 preview.md,摘要仍会读取统计结果和示例数据行(最多 10 行),并将这些材料发送给配置的模型。摘要根据统计结果判断数据质量和分布;示例数据行只用于帮助理解,不能代表整张表的数据分布。

数据库参数

以下每个 YAML 都是一条完整连接的配置示例。保留项目其他配置,只将所需连接加入 databases。示例都指定了要同步的库或 Schema,避免第一次同步就遍历大量无关表;按实际对象名称修改。

Doris

Doris 使用 FE 的 MySQL 协议端口。基本配置如下;需要筛选表、读取示例数据行或限制查询范围时,可采用前面的通用配置。

databases:
  - name: doris_prod
    type: doris
    host: doris.example.com
    port: 9030
    user: analytics_reader
    password: {{ env('DORIS_PASSWORD_YAML') }}
    catalog: internal
    database: analytics
    schema_name: analytics
参数说明
host
必填
FE 主机名或 IP;不是 Web 控制台 URL,也不是 BE 地址
port
默认:9030
FE 的 MySQL 协议端口
user
必填
有权读取目标库表的数据库账号
password
默认:空字符串
上述账号的密码
catalog
可选
internal 表示内置 Catalog,也可填已有外部 Catalog 的名称
database
可选
SQL 连接的默认数据库;本身不等于同步范围
schema_name
可选
要同步的数据库名,例如 analytics,不加 Catalog 前缀

设置 schema_name 后只同步该库;未设置 catalog 时,使用 internal Catalog 下的同名库。不设置 schema_name 时,Cappy 列出指定 Catalog 中的库;两者都不填时,Cappy 列出账号有权访问的 Catalog 和库。为外部 Catalog 配置时,将 catalog 改为其名称,database 和 schema_name 填其中的库名。

include / exclude 同时支持 analytics.orders 和 internal.analytics.orders。数据库上下文目录中的 Schema 包含 Catalog,例如 schema=internal.analytics。

StarRocks

databases:
  - name: starrocks_prod
    type: starrocks
    host: starrocks.example.com
    port: 9030
    user: analytics_reader
    password: {{ env('STARROCKS_PASSWORD_YAML') }}
    catalog: default_catalog
    database: analytics
    schema_name: analytics
参数说明
host、user
必填
FE 地址和数据库账号
port
默认:9030
FE 的 MySQL 协议端口
password
默认:空字符串
数据库密码
catalog
可选
内置 Catalog 为 default_catalog;也可填外部 Catalog 名称
database
可选
连接默认数据库
schema_name
可选
要同步的库名,不含 Catalog 前缀

范围选择方式与 Doris 相同,但默认 Catalog 为 default_catalog。Cappy 的字段是单个 catalog,不是 catalogs 列表。需要分别限制多个 Catalog 的范围时,添加名称不同的连接。将 type 设为 starrocks,Cappy 才能正确读取 StarRocks 的表结构等信息。

PostgreSQL

databases:
  - name: postgres_prod
    type: postgres
    host: postgres.example.com
    port: 5432
    database: analytics
    user: analytics_reader
    password: {{ env('POSTGRES_PASSWORD_YAML') }}
    schema_name: public
参数说明
host、database
必填
PostgreSQL 主机和数据库名
user、password
必填
数据库账号和密码
port
默认:5432
PostgreSQL 连接端口
schema_name
可选
同步指定 Schema;不填时列出当前库中可访问的非系统 Schema

例如只需要 public 中的订单表,可添加 include: [public.orders]。database 是数据库名,schema_name 是库内命名空间,两者不要混填。Cappy 的 PostgreSQL 配置未提供 sslmode 字段,不要套用后面的 Redshift 参数。

MySQL

databases:
  - name: mysql_prod
    type: mysql
    host: mysql.example.com
    port: 3306
    database: analytics
    schema_name: analytics
    user: analytics_reader
    password: {{ env('MYSQL_PASSWORD_YAML') }}
参数说明
host、database
必填
MySQL 主机和连接默认数据库
user、password
必填
数据库账号和密码
port
默认:3306
MySQL 连接端口
schema_name
可选
限定要同步的数据库;不填时列出账号有权访问的非系统库

MySQL 的 Schema 对应数据库。像示例一样同时填写 database 和 schema_name,即可将默认查询库与同步库设为同一个库。

ClickHouse

默认使用 HTTP 接口。以下示例通过 HTTPS 连接:

databases:
  - name: clickhouse_prod
    type: clickhouse
    host: clickhouse.example.com
    protocol: http
    port: 8443
    database: analytics
    user: analytics_reader
    password: {{ env('CLICKHOUSE_PASSWORD_YAML') }}
    secure: true
    include: [analytics.*]
    connect_timeout: 10
    send_receive_timeout: 120
参数说明
host、database、user
必填
服务主机、默认数据库和账号
password
默认:空字符串
数据库密码
protocol
默认:http
http 或原生 TCP 协议 native
secure
默认:false
HTTP 下启用 HTTPS,native 下启用 TLS
port
默认:按协议和加密选择
HTTP 为 8123,HTTPS 为 8443;native 为 9000,native + TLS 为 9440
verify
默认:true
native + TLS 下是否校验证书
connect_timeout
默认:使用驱动默认值
建立连接的超时,单位为秒
send_receive_timeout
默认:使用驱动默认值
发送和接收数据的超时,单位为秒
tolerate_unreadable_system_tables
默认:false
无权读取系统表时,按 include 中指定的表名读取结构

如果服务只开放 native 协议,将连接中的相关字段改为:

protocol: native
port: 9440
secure: true
verify: true

verify: false 会跳过 native TLS 证书检查,仅在明确接受这一行为的环境使用。database 不限制同步时查找库表的范围;通过 include: [analytics.*] 选择库。对于系统表不可读的受限连接,使用精确表名,例如:

tolerate_unreadable_system_tables: true
include:
  - analytics.events
  - analytics.users

无法读取系统表时,Cappy 不能查出通配符匹配的表,因此需要逐个填写表名。ClickHouse 的排序键、分区键、主键和 Projection 等可读取的定义写入 columns.md,无需另加索引模板。

DuckDB

databases:
  - name: warehouse_local
    type: duckdb
    path: ./analytics.duckdb
    include: [main.*]
参数说明
path
默认::memory:
已有 DuckDB 文件的路径。持久数据使用文件路径;默认内存库不会自动包含业务数据

相对路径以运行项目的目录为基准。文件连接只读,连接后关闭外部文件和网络访问,并锁定配置;该连接不能读取其他本地文件、远程 URL 或 ATTACH 其他数据库。运行实例也需要能读取同一数据库文件。

不要将连接命名为 duckdb_local:这是 Cappy 内置文件查询引擎使用的名称。

MotherDuck

databases:
  - name: motherduck_prod
    type: motherduck
    database: analytics
    token: {{ env('MOTHERDUCK_TOKEN_YAML') }}
    include: [main.*]
参数说明
database
可选
MotherDuck 数据库名;省略时使用账号默认数据库
token
可选
MotherDuck 访问 Token;未填时由 DuckDB 读取运行环境的 MOTHERDUCK_TOKEN 或 motherduck_token

直接使用 MOTHERDUCK_TOKEN 环境变量时,变量保存原始 Token,不做 _YAML 编码,并从配置中省略 token。Cappy 自动构造 MotherDuck 连接路径;已有 type: duckdb 加 md: 路径的配置仍可使用。MotherDuck 需要访问远程服务,不使用本地 DuckDB 的外部访问限制。

BigQuery

databases:
  - name: bigquery_prod
    type: bigquery
    project_id: company-data-prod
    dataset_id: analytics
    credentials_path: /etc/cappy/credentials/bigquery.json
    location: US
    max_query_size: 5
    partition_filters:
      events: "event_date >= DATE_SUB(CURRENT_DATE(), INTERVAL 7 DAY)"
参数说明
project_id
必填
GCP 项目 ID,不是显示名称
dataset_id
可选
要同步的 Dataset;不填时列出项目内可访问的 Dataset
credentials_path
可选
服务账号 JSON 文件路径
credentials_json
可选
服务账号凭据对象,优先于 credentials_path
sso
默认:false
设为 true 启用本地浏览器认证流程;未填写认证信息时可使用 Application Default Credentials(ADC)
location
可选
BigQuery 地区,用于查询历史的区域选择,例如 US
max_query_size
默认:不限制
单次 SQL 扫描上限,单位为 GB;省略或 0 关闭检查
partition_filters
默认:{}
为每张表指定 SQL 筛选条件,用于读取要求分区筛选的表中的示例数据行

可以使用服务账号文件、credentials_json 对象或环境中的 ADC 完成认证。使用本地交互认证时,移除凭据文件字段并设置 sso: true;无人值守环境应提供无需浏览器交互的有效凭据。

max_query_size 为正数时,执行 SQL 前会先估算扫描的数据量(dry run),超出上限就拒绝该查询,并返回估算量和上限。它不替代同步模板的成本控制,也不限制其他数据库。

partition_filters 的键是表名,例如 events,不是 analytics.events。设置后,读取示例数据行时会使用这些条件替代自动生成的分区筛选条件,但不会改写用户的所有查询。同步的 columns.md 分别记录分区列与聚簇列,并尽可能保留 BigQuery 原生类型,例如 DATETIME、TIMESTAMP 和 INT64。

Snowflake

databases:
  - name: snowflake_prod
    type: snowflake
    account_id: xy12345.us-east-1
    username: analytics_reader
    password: {{ env('SNOWFLAKE_PASSWORD_YAML') }}
    database: ANALYTICS
    warehouse: COMPUTE_WH
    schema_name: PUBLIC
参数说明
account_id、username、database
必填
Snowflake 账号标识、用户名和数据库名;用户名字段是 username
warehouse
可选
执行查询使用的计算仓库;需有可用且获授权的 Warehouse
schema_name
可选
同步指定 Schema,值会转为大写;不填时列出非系统 Schema
password
可选
密码认证使用
private_key_path
可选
PEM 私钥文件路径,与 private_key 二选一
private_key
可选
PEM 私钥文本,与 private_key_path 二选一
passphrase
可选
加密私钥的解密口令
authenticator
可选
externalbrowser、username_password_mfa、jwt_token、oauth 或 programmatic_access_token
token
可选
Token 认证的值,PAT 使用 programmatic_access_token

按账号启用的方式选择认证。以下片段替换连接中的 password 字段,其余连接参数保留。

密钥对认证:

private_key_path: /etc/cappy/credentials/snowflake.p8
passphrase: {{ env('SNOWFLAKE_KEY_PASSPHRASE_YAML') }}

未加密私钥省略 passphrase;需要直接填写 PEM 私钥内容时,使用 private_key: {{ env('SNOWFLAKE_PRIVATE_KEY_YAML') }},其中变量采用前述 JSON 字符串编码以保留换行。

浏览器 SSO:

authenticator: externalbrowser

Programmatic Access Token(PAT):

authenticator: programmatic_access_token
token: {{ env('SNOWFLAKE_PAT_YAML') }}

同步时也会读取可访问的 Snowflake semantic views,将指标、维度和关系写入 schema=<schema>/semantic_view=<name>/definition.md。没有可用 semantic views 时跳过,不需要另设配置。

Databricks

databases:
  - name: databricks_prod
    type: databricks
    server_hostname: adb-1234567890123456.7.azuredatabricks.net
    http_path: /sql/1.0/warehouses/abc123
    access_token: {{ env('DATABRICKS_TOKEN_YAML') }}
    catalog: main
    schema_name: analytics
参数说明
server_hostname
必填
SQL Warehouse 或集群连接信息中的 Server Hostname,不加 https://
http_path
必填
同一处连接信息中的 HTTP Path,不是浏览器页面地址
access_token
必填
有权访问目标 Warehouse 和数据的个人访问 Token
catalog
可选
Unity Catalog 名称
schema_name
可选
要同步的 Schema;不填时列出可访问的 Schema
temp_schema
可选
查询需要临时保存数据时使用的 Schema,需要有写入权限

如果 analytics 只有读取权限,而查询需要暂存数据,可以在同一连接增加:

temp_schema: scratch

此时 scratch 成为连接的默认 Schema,schema_name: analytics 仍决定同步范围。scratch 需要事先存在,并向连接账号授予所需写入权限。

SQL Server

databases:
  - name: mssql_prod
    type: mssql
    host: sqlserver.example.com
    port: 1433
    database: analytics
    user: analytics_reader
    password: {{ env('MSSQL_PASSWORD_YAML') }}
    schema_name: dbo
    driver: ODBC Driver 18 for SQL Server
参数说明
host、database
必填
SQL Server 主机和数据库名
user、password
必填
SQL 账号和密码
port
默认:1433
SQL Server 连接端口
schema_name
可选
同步指定 Schema;不填时列出非系统 Schema
driver
默认:自动检测
已安装的 ODBC 驱动名称,例如 ODBC Driver 18 for SQL Server 或 FreeTDS

driver 仅选择驱动,不会安装它。同步和查询的运行环境都需提供对应 ODBC 驱动;驱动名称必须与安装名称一致。该连接的 type 为 mssql,不是 sqlserver。

Fabric

从 Warehouse 或 Lakehouse 的连接信息中复制 SQL 端点地址。以下示例使用 Azure CLI 登录身份:

databases:
  - name: fabric_prod
    type: fabric
    host: workspace.datawarehouse.fabric.microsoft.com
    port: 1433
    database: analytics
    schema_name: dbo
    auth_mode: azure_cli
    driver: ODBC Driver 18 for SQL Server
参数说明
host、database
必填
Fabric SQL 端点与 Warehouse / Lakehouse 名称
port
默认:1433
SQL 端口
schema_name
可选
要同步的 Schema
driver
默认:自动选择 Microsoft ODBC 驱动
使用 ODBC Driver 17 for SQL Server 或 ODBC Driver 18 for SQL Server;不使用 FreeTDS
auth_mode
默认:sql_password
从下面四种认证方式中选择
user、password
密码认证必填
SQL 账号和密码
client_id、client_secret
服务主体认证必填
Azure 应用 Client ID 和 Client Secret
tenant_id
可选
Azure 租户 ID,用于服务主体认证
auth_mode凭据来源与适用方式
azure_cli使用当前运行账号执行 az login 后的凭据
azure_interactive连接时打开浏览器登录,适合交互式环境
azure_service_principal使用应用身份,配置 client_id、client_secret,按需填写 tenant_id
sql_password在端点支持 SQL 密码认证时使用,填写 user、password

需要让服务自动运行、无需手动登录时,将示例中的 auth_mode 替换为以下字段:

auth_mode: azure_service_principal
client_id: 00000000-0000-0000-0000-000000000001
client_secret: {{ env('FABRIC_CLIENT_SECRET_YAML') }}
tenant_id: 00000000-0000-0000-0000-000000000002

Client ID 和 Tenant ID 为占位值,替换为自己应用的信息。Cappy 使用的字段是 host 和 auth_mode,不是 server 或 auth_method。

Redshift

databases:
  - name: redshift_prod
    type: redshift
    host: cluster.example.us-east-1.redshift.amazonaws.com
    port: 5439
    database: analytics
    auth_mode: password
    user: analytics_reader
    password: {{ env('REDSHIFT_PASSWORD_YAML') }}
    schema_name: public
    sslmode: require
参数说明
host、database
必填
Redshift 端点和数据库名
port
默认:5439
Redshift 连接端口
auth_mode
默认:password
password 或 azure_entra_id
user、password
密码认证和同步需要
数据库账号和密码
schema_name
可选
要同步的 Schema;不填时列出当前库的非系统 Schema,包括可访问的数据共享 Schema
sslmode
默认:require
传给 PostgreSQL 驱动的 SSL 模式
ssh_tunnel
可选
经跳板机访问私网端点时填写,见下例

azure_entra_id 用于已配置 Microsoft Entra ID 身份传递的实例。同步仍需要 user、password 读取元数据;运行时查询必须使用当前登录用户的访问 Token,不会改用同步账号。仅改这一字段不能完成组织登录和数据库联合认证的配置。

如果需经 SSH 跳板机连接,在同一连接下增加:

ssh_tunnel:
  ssh_host: bastion.example.com
  ssh_port: 22
  ssh_username: ec2-user
  ssh_private_key_path: ~/.ssh/id_rsa
  ssh_private_key_passphrase: {{ env('SSH_KEY_PASSPHRASE_YAML') }}

ssh_host、ssh_username、ssh_private_key_path 必填,ssh_port 默认 22。未加密私钥省略 ssh_private_key_passphrase。数据库的 host 仍填从跳板机可访问的 Redshift 地址;SSH 账号与数据库账号是两套凭据。

Athena

databases:
  - name: athena_prod
    type: athena
    s3_staging_dir: s3://company-query-results/athena/
    region_name: us-east-1
    schema_name: analytics
    work_group: primary
    profile_name: analytics
参数说明
s3_staging_dir
必填
存放 Athena 查询结果的 S3 路径,不是原始数据目录
region_name
必填
Athena 所在 AWS Region
schema_name
可选
Athena 数据库名;省略时连接默认使用 default,同步时仍会列出所有可访问的库
work_group
默认:primary
执行查询的 Workgroup
profile_name
可选
运行环境中已配置的 AWS Profile 名称
aws_access_key_id、aws_secret_access_key
可选,成对提供
直接填写的 AWS 访问密钥
aws_session_token
可选
使用临时访问凭据时提供

profile_name 优先于直接填写的访问密钥。改用访问密钥时,移除 profile_name,加入:

aws_access_key_id: {{ env('ATHENA_ACCESS_KEY_ID_YAML') }}
aws_secret_access_key: {{ env('ATHENA_SECRET_ACCESS_KEY_YAML') }}
aws_session_token: {{ env('ATHENA_SESSION_TOKEN_YAML') }}

长期密钥省略 aws_session_token。Profile 和访问密钥都未填写时,AWS 驱动使用运行环境中的认证信息。账号需能执行 Athena 查询、访问所需元数据与数据,并向结果 S3 路径写入查询结果。

Trino

下面使用 HTTPS 和密码认证。端口应与 Coordinator 实际开放的端口一致:

databases:
  - name: trino_prod
    type: trino
    host: trino.example.com
    port: 8443
    catalog: iceberg
    schema_name: analytics
    user: analytics_reader
    password: {{ env('TRINO_PASSWORD_YAML') }}
    http_scheme: https
    verify: true
参数说明
host、catalog、user
必填
Coordinator 主机、Catalog 名称、用户名
port
默认:8080
Coordinator 端口;改为 HTTPS 不会自动修改端口
schema_name
可选
同步指定 Schema,不填时列出非系统 Schema
password
可选
密码认证,需要 HTTPS
http_scheme
默认:http
http 或 https
verify
默认:true
HTTPS 下校验证书;可填 false 关闭校验,或填自定义 CA 文件路径
jwt_token
可选
OAuth2 / JWT 认证使用的 Bearer Token
jwt_token_file
可选
保存 Bearer Token 的文件路径,每次连接时重新读取

使用内部 CA 时,将 verify 改为证书包路径:

verify: /etc/ssl/certs/internal-ca.pem

使用 JWT 时,移除 password,改为以下两种方式之一:

jwt_token: {{ env('TRINO_JWT_YAML') }}
jwt_token_file: /var/run/trino/token

Token 文件保存原始 Token,可由外部程序定期更新。优先级为非空文件中的 Token → jwt_token → password;文件不存在或为空时继续尝试下一项。使用 JWT 会强制 HTTPS,但仍需填写正确的 TLS 端口。

同步时会尝试读取表与列注释,一并加入结构上下文,不需要额外模板。

SQL 方言

Cappy 根据连接的 type 提供相应的 SQL 指引。例如 SQL Server 和 Fabric 使用 TOP N,BigQuery 使用反引号和 SAFE_DIVIDE,Doris、StarRocks 和 MySQL 使用相应标识符引号规则,Redshift 使用其支持的窗口函数和聚合写法。

因此应填写数据库真实类型,不要仅因兼容某种协议就改成其他 type。连接多个不同数据库时,Agent 按目标连接选择 SQL 写法。

同步数据库

下面以开头的 Doris 连接 warehouse 为例。my-project 代表已初始化的项目文件夹,其中包含 config.yaml。

检查连接

在项目目录运行:

cd my-project
cappy debug

检查 warehouse 的连接结果。失败时先核对 FE 地址和端口、环境变量,以及账号是否有目标库表的读取权限。ODBC 连接还需确认驱动已安装。

同步表结构和示例数据行

cappy sync -p databases:warehouse

warehouse 是连接的 name,不是数据库名。命令连接数据库,列出所选的 Schema 和表,再按模板生成文件。留意日志中的表数量和模板错误,确认所需表确实被处理。

同步全部数据库连接可用 cappy sync -p databases;cappy sync 还会处理项目中其他已配置的上下文来源。

检查生成文件

假设 internal.analytics 中有一张 orders 表,使用开头的配置会生成如下目录:

my-project/
├── config.yaml
└── databases/
    └── type=doris/
        └── database=internal.analytics/
            └── schema=internal.analytics/
                └── table=orders/
                    ├── annotations.md
                    ├── columns.md
                    └── preview.md

打开 columns.md 核对字段和类型,打开 preview.md 检查示例数据行是否来自目标表。其他模板仅在启用后生成;不要仅凭命令结束就判断所有表的模板都已成功生成。

上下文文件

自动生成的文件在 frontmatter 中带有 type: generated,再次同步时可能覆盖。annotations.md 带有 type: manual,用于补充说明表中每条记录代表什么、字段的业务含义及使用限制;同一张表后续同步时保留已有内容。跨表规则写在 RULES.md。

例如,一张包含 order_id 和 status 字段的订单表,其 columns.md 会包含类似内容。下面数值仅用于说明文件格式:

# orders

**Dataset:** `internal.analytics`

## Description

One row per order.

## Table Metadata

| Property | Value |
|----------|-------|
| **Row Count** | 200 |

## Columns (2)

- order_id (BIGINT)
- status (VARCHAR, "Order status")

preview.md 展示示例数据行,每条记录对应一行 JSON:

# orders - Preview

**Dataset:** `internal.analytics`

## Rows (2)

- {"order_id": 1001, "status": "completed"}
- {"order_id": 1002, "status": "cancelled"}

启用 profiling 后,profiling.md 还会记录计算时间和字段统计。例如:

# orders - Profiling

**Dataset:** `internal.analytics`

**Computed at:** `2026-10-29T00:00:00+00:00`

**Columns:** 2

## Column Profiles (JSONL)

- {"column": "order_id", "type": "BIGINT", "total_count": 200, "null_count": 0, "distinct_count": 200}

这些文件帮助 Agent 查找和理解表,查询结果仍从数据库取得。将配置与上下文按发布流程更新到运行项目后,即可在对话中选择相应数据提问;运行实例需要能访问数据库并取得同样的凭据。

选择表

include / exclude 使用 glob 通配符匹配 schema.table;Doris 和 StarRocks 也支持 catalog.schema.table。例如,添加到开头的 Doris 连接中:

include:
  - analytics.*
  - marts.fct_*
exclude:
  - analytics.tmp_*
  - marts.fct_*_backup

该配置选择 analytics 下的表和 marts 下以 fct_ 开头的表,再排除临时表与备份表。要同时同步这两个库,还需移除开头的 schema_name: analytics;否则同步范围仍然只有 analytics。名称和大小写应与数据库实际对象一致。

模式匹配范围
analytics.orders一张指定表
analytics.*一个 Schema 下的所有表
*.orders所有已列出的 Schema 中名为 orders 的表
analytics.fct_*一个 Schema 下以 fct_ 开头的表
internal.analytics.*Doris / StarRocks 中一个 Catalog 下指定库的表

只刷新某张表时,在原配置范围内使用 -s:

cappy sync -p databases:warehouse -s internal.analytics.orders

-s 不扩大 include 或 schema_name 的范围。局部同步时,也不会清理不再使用的表目录。完整同步会清理不再选中的表目录,其中可能包含 annotations.md;删除连接配置也可能清理对应目录,-s 不能阻止整个连接目录的清理。缩小范围或删除连接前,先保存其中需要保留的人工说明。

第一次接入可先选择核心库表和默认模板,核对表结构和示例数据行后再扩展范围;查询历史、统计和摘要按需要加入,避免无用上下文和不必要的查询或模型调用。