dsh-clickhouse:带只读护栏的 ClickHouse 数据问答插件

前言

在 DSH(DeepSeek Harness)里做自然语言问数,常见做法是手写 MCP 或临时脚本去连 ClickHouse:既要让模型能探库表结构,又要防止误执行 INSERT、ALTER 一类语句。连接串、结果行数、超时和资源上限往往分散在多处,排查「连不上」和「查挂了」也费时。

下面介绍社区插件 dsh-clickhouse(维护者 saichao,分类:联网工具)。它把「库表探查 + 单条只读 SQL」收成七个 clickhouse_* 工具,供 agent 按「先摸清结构、再问数」的顺序调用;实现上只用 Node 内置 fetch,装进 profile 后无额外运行时依赖解析。

这是什么

dsh-clickhouse 面向 DSH / DeepSeek Harness,定位是 ClickHouse 结构探索与带护栏的只读查询。简介原文为:ClickHouse query tools for DSH / DeepSeek Harness: schema exploration plus guarded read-only SQL;中文说明为带只读护栏的 ClickHouse 数据问答插件,零运行时依赖。

插件以当前 DSH 进程权限访问你配置的 ClickHouse HTTP 端点;安装前请自行审阅源码与许可证。

核心功能

七个工具与使用顺序

工具按实际问数流程编排,并支持按字段名反查表:

工具 用途
clickhouse_list_databases 列出库及每库表数/字段数(可选磁盘占用)
clickhouse_list_tables 列出某库的表:引擎、排序键、行数、占用、注释
clickhouse_describe_table 字段、类型、默认值、主键/排序键、注释
clickhouse_sample_rows 抽样看真实数据,可只取指定字段
clickhouse_query 执行单条只读 SQL,返回 Markdown 表格或 JSON
clickhouse_explain EXPLAIN 执行计划(plan / estimate / syntax / ast / pipeline)
clickhouse_search_columns 按字段名关键词反查「字段在哪张表」

返回值对模型是结构化的(含 summary、columns、rows、rowCount、truncated、elapsedMs、queryId、executedSql、notes 等),并由工具渲染为 Markdown 表格。

只读护栏

客户端:每条语句只允许一条 SQL,且 leading keyword 为 SELECT / WITH / SHOW / DESCRIBE / EXPLAIN / EXISTS;语句任意位置出现写关键字会被拒绝;并拒绝 INTO OUTFILE、FORMAT、SETTINGS 及外部表函数(可通过配置放宽部分项)。

服务端:查询附带 max_result_rows(result_overflow_mode=break)、max_execution_time、max_memory_usage;配置项 readonly 默认为 true 时还会加 readonly=1(老版本 ClickHouse 如 21.12 上只读模式可能拒 numbers() 等,确需时可设为 false,客户端护栏仍生效)。

README 注明已在 ClickHouse 21.12 上验证;非 ASCII 别名需用反引号,否则会给出改法提示而非裸语法错误。

零运行时依赖

不依赖 profile 内额外 node_modules 解析,HTTP 请求走 Node 内置 fetch。

安装与启用

社区目录与 README 给出的三步与命令如下。

  1. 安装:DSH 设置 → 插件(插件市场)搜索 clickhouse,选择 dsh-clickhouse 安装。命令行等价:
dsh plugin --profile <profile> add github:saichao/dsh-clickhouse
  1. 启用并重启:在市场里启用插件后重启 DSH。

  2. 配置连接:在 profile 用户补丁层写入连接信息(路径示例 ~/.dsh/profiles/<profile>/cordis.patch.yml),再重启一次;若漏配,插件会给出明确报错(含 HTTP 8123 与 TCP 9000 的区分说明),而不是笼统的 fetch failed:

- id: clickhouse
  name: dsh-clickhouse
  config: { url: http://<主机>:8123, user: default, password: '' }

从源码部署时,README 还提供 pnpm install、pnpm build、node scripts/install.mjs 等流程(面向开发者维护 profile bundle);一般用户以市场安装与 cordis.patch.yml 覆盖为主。

配置改动注意:改 cordis.patch.yml 前建议备份(同文件常含模型与密钥等);README 实测用户补丁层覆盖后 DSH HMR 可立即重组工具树,但 bundle 安装路径仍建议以重启后行为为准确认。

配置要点

推荐在用户补丁层按 id: clickhouse 整行覆盖 bundle 里的 config:

- id: clickhouse
  name: dsh-clickhouse
  config:
    url: http://localhost:8123
    user: default
    password: ''
    database: default
    readonly: true
配置项 默认值 说明
url http://localhost:8123 ClickHouse HTTP 接口;也接受 jdbc:clickhouse://... 并转为 HTTP
user / password default / 空 兼容 CLICKHOUSE_USER / CLICKHOUSE_PASSWORD 命名
database default 未指定库时的默认库
readonly true 为 true 时服务端 readonly=1
maxRows 200 单次返回行数上限(硬上限 10000)
timeoutSeconds 60 max_execution_time(硬上限 600)
maxMemoryGb 4 max_memory_usage
maxCellChars 400 单单元格最大字符数
allowQuerySettings false 是否允许 SQL 自带 SETTINGS
allowExternalSources false 是否允许 file() / url() / s3() 等
allowDatabases / denyDatabases [] 库白名单 / 黑名单
sampleRows 20 clickhouse_sample_rows 默认抽样行数
guidance true 是否向系统提示注入插件使用说明

典型用法

在对话中让模型依次调用工具即可;README 示例(任意实例均可复现的 system 库)如下。

clickhouse_query 执行:

SELECT database AS `库`, count() AS `表数` FROM system.tables
WHERE database LIKE 'system%' GROUP BY database ORDER BY `表数` DESC LIMIT 5

模型侧可见类似输出摘要:

查询完成:1 行 / 2 ms
| 库 | 表数 |
| --- | --- |
| system | 75 |

完整演示输出见仓库 docs/demo-output.txt。本地也可用 node scripts/demo.mjs 打印与模型一致的渲染结果(需已安装并配置)。

适用场景与注意

适合:已在 DSH 中做 ClickHouse 问数、希望 agent 自带探库与只读 SQL、且希望限制写操作与结果规模的团队或个人。

注意:

  • 插件以 DSH 进程权限 访问 ClickHouse;应对生产库时配合 allowDatabases / denyDatabases 与网络隔离。
  • url 必须是 HTTP 接口(默认 8123),不是原生 TCP 9000。
  • 社区目录站点 skillhub.cn 为独立生态索引,与 DeepSeek / 幻方无官方从属关系;插件星标以目录页展示为准(当前线索为 0)。

结尾

dsh-clickhouse 把 ClickHouse 问数收敛为七个有序工具,并在客户端与服务端双层限制只读与资源。若要在 Harness 里接自己的实例,可从社区目录页查看条目说明,或在 GitHub 阅读 README 中的护栏范围与验证记录。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye