- 数据库
- 开发者工具
- 桌面应用
- CLI
- MCP 服务
- AI 应用
【免费下载链接】dbx
15MB,轻量级跨平台数据库客户端、数据库管理工具。支持 MySQL、PostgreSQL、SQLite、Redis、MongoDB、DuckDB、ClickHouse、SQL Server 等。15MB, lightweight, cross-platform database client. Supports MySQL, PostgreSQL, SQLite, Redis, MongoDB, DuckDB, ClickHouse, SQL Server and more.
导读
DBX 是一个轻量级跨平台数据库客户端,支持 MySQL、PostgreSQL、SQLite、Redis、MongoDB、DuckDB、ClickHouse、SQL Server 等数十种数据源。面对如此多的连接目标,如何让"连接类型"在 Rust 内核、前端表单、驱动商店与 MCP 服务之间保持一致?答案就在plugins/connection-types/目录:这里的 YAML 描述符是 DBX 连接类型注册的单一事实来源(source of truth)。本文以 plugins/connection-types/README.md 为骨架,结合仓库中的真实描述符与生成器源码,完整讲解连接类型的定义字段、能力矩阵、前端 profile 绑定、代码生成链路,以及"何时新增连接类型、何时只加 profile"的决策准则。
一、连接类型描述符:注册体系的单一事实来源
plugins/connection-types/*.yaml是整个 DBX 连接类型注册的权威数据源。它覆盖的范围远超"数据库"本身,从 README 原文可以归纳为五类:
| 类别 | 覆盖目标 | 示例描述符 |
|---|---|---|
| SQL 数据库 | 传统关系型数据库 | mysql.yaml、postgres.yaml、sqlserver.yaml、oracle.yaml |
| 文档与向量存储 | Document / Vector Store | mongodb.yaml、elasticsearch.yaml、qdrant.yaml、milvus.yaml、weaviate.yaml、chromadb.yaml |
| 键值与配置服务 | KV / Config Service | redis.yaml、etcd.yaml、zookeeper.yaml、nacos.yaml、consul.yaml |
| 消息队列与 MQTT | MQ / MQTT Broker | mq.yaml(Kafka / RocketMQ / RabbitMQ profile)、mqtt.yaml |
| 通用 JDBC 目标 | Generic JDBC | jdbc.yaml、plugin.yaml |
除描述符外,profiles/catalog.yaml 保存前端"连接选择器"(connection picker)所需的 product profile:把产品名称、默认端口、默认用户与稳定连接类型绑定在一起。
需要特别说明两个命名细节(README 明确提示):
dbType与DatabaseType保留了历史名称。即使某些目标并非数据库(如 ZooKeeper、MQTT),其序列化 API 字段仍沿用dbType名称,以保证 API 兼容性。- SQL 语法、DDL 模板、类型目录与元数据查询细节不在本目录,它们位于
plugins/dialects/*.yaml。连接类型只管"连接与能力",不管"SQL 方言细节",这是模块边界清晰的设计。
二、描述符字段全解析
一个连接类型描述符由顶层元数据 + 能力矩阵组成。以下结合真实文件逐字段说明。
2.1 顶层字段:身份、运行模式与连接默认值
以最典型的 mysql.yaml 为例:
schemaVersion: 1 order: 10 dbType: mysql rustVariant: Mysql label: MySQL dialect: MySQL runtimeMode: native mcpMode: direct singleConnectionPool: false metadataConnectionScoped: true skipTcpProbe: false defaultPort: 3306 traits: diagramSql: true supportLevel: operate字段语义如下:
| 字段 | 说明 | 示例取值 |
|---|---|---|
schemaVersion | 描述符格式版本,当前为 1 | 1 |
order | 稳定展示顺序,正数且在有效 driver key 间唯一 | 10、70、710 |
dbType | 稳定连接类型 ID,API 序列化使用 | mysql、mq、jdbc |
rustVariant | 生成的 Rust 枚举变体名 | Mysql、MessageQueue、Jdbc、MongoDb、Mqtt |
label | 展示名称 | MySQL、Message Queue |
dialect | 绑定的 SQL 方言(可选) | MySQL |
runtimeMode | 运行模式:native(原生实现)、agent(走 Agent)、external(外部驱动/进程) | native/agent/external |
mcpMode | MCP 模式:direct(直连)、bridge(桥接)、unsupported(不支持) | direct/bridge/unsupported |
agentKey | 绑定的 Agent 键,用于 Agent 驱动映射(仅 agent 模式) | mongodb、kafka、rocketmq |
singleConnectionPool | 是否使用单连接池 | MySQLfalse,JDBCtrue |
metadataConnectionScoped | 元数据是否按连接作用域管理 | MySQLtrue,MQfalse |
skipTcpProbe | 是否跳过 TCP 连通性探测 | MQtrue(非 TCP 服务) |
defaultPort | 默认端口 | MySQL3306、MQTT1883、MQ8080 |
traits | 特性开关(如diagramSql、schemaAware) | 见下方说明 |
supportLevel | 支持级别:operate(完整运维)/browse(浏览)/connect(仅连接) | operate/browse/connect |
formKind | 连接表单种类,有限编码值而非任意表单引擎 | mq、mqtt、jdbc |
对比几个真实描述符可以看到不同目标差异巨大:
- redis.yaml:
mcpMode: bridge,supportLevel: connect,只开启queryExecution,元数据浏览、对象浏览器、表格编辑全部关闭——Redis 是非关系型键值存储,能力矩阵与 MySQL 截然不同。 - mongodb.yaml:
runtimeMode: agent,绑定agentKey: mongodb,并在driverStoreVisible: true+driverStoreOrder: 41声明其在驱动商店中的展示顺序。 - jdbc.yaml:
runtimeMode: external、singleConnectionPool: true、formKind: jdbc,traits开启schemaAware/treeSchema/databaseObjectTree——通用 JDBC 目标能力保守但保留查询、元数据浏览与 SQL 文件执行。
2.2 capabilities:能力矩阵(共享能力模型)
每个描述符的capabilities字段用布尔值声明该连接类型支持的产品能力。完整能力清单如下(综合 mysql.yaml、mq.yaml、redis.yaml 等文件):
| 能力键 | 含义 | MySQL | MQ | Redis | JDBC | MQTT |
|---|---|---|---|---|---|---|
queryExecution | SQL/命令查询执行 | ✅ | ❌ | ✅ | ✅ | ❌ |
metadataBrowse | 元数据浏览 | ✅ | ✅ | ❌ | ✅ | ❌ |
objectBrowser | 对象浏览器 | ✅ | ✅ | ❌ | ✅ | ❌ |
objectSource | 对象源码/DDL 查看 | ✅ | ❌ | ❌ | ❌ | ❌ |
schemaSearch | 模式搜索 | ✅ | ❌ | ❌ | ❌ | ❌ |
diagram | ER 图 | ✅ | ❌ | ❌ | ❌ | ❌ |
tableDataEdit | 表格数据编辑 | ✅ | ❌ | ❌ | ❌ | ❌ |
tableStructureEdit | 表结构编辑 | ✅ | ❌ | ❌ | ❌ | ❌ |
tableImport | 数据导入 | ✅ | ❌ | ❌ | ❌ | ❌ |
dataTransfer | 数据传输 | ✅ | ❌ | ❌ | ❌ | ❌ |
sqlFileExecution | SQL 文件执行 | ✅ | ❌ | ❌ | ✅ | ❌ |
databaseCreate | 数据库创建 | ✅ | ❌ | ❌ | ❌ | ❌ |
fieldLineage | 字段血缘 | ✅ | ❌ | ❌ | ❌ | ❌ |
sqlExplain | SQL 执行计划 | ✅ | ❌ | ❌ | ❌ | ❌ |
userAdmin | 用户管理 | ✅ | ❌ | ❌ | ❌ | ❌ |
driverManagement | 驱动管理入口 | ❌ | ✅ | ❌ | ❌ | ❌ |
注意 mq.yaml 的能力矩阵:queryExecution: false但metadataBrowse与objectBrowser: true、driverManagement: true——消息队列没有 SQL 查询,但有 Topic/队列浏览与驱动管理。这说明能力矩阵不是"一刀切",而是与产品形态精确对齐。
2.3 specializedSurface:专用管理面
README 给出了明确规则:只有产品使用共享能力矩阵无法表达的专用管理界面时,才设置specializedSurface: true;否则至少启用一项产品能力。
MQTT 描述符 正是该规则的实例:specializedSurface: true,且全部 16 项 capability 均为false。原因是 MQTT 采用完全不同的协议、配置模型与 UI 工作流(发布/订阅而非查询),它依赖独立的管理界面,无法用通用能力矩阵表达。
2.4 driverProfiles 与驱动商店排序
连接类型可包含多个运行时 profile。README 给出的经典例子是 mq.yaml:
dbType: mq rustVariant: MessageQueue formKind: mq driverProfiles: - profile: kafka label: Apache Kafka agentKey: kafka storeVisible: true storeOrder: 44 - profile: rocketmq label: Apache RocketMQ agentKey: rocketmq storeVisible: true storeOrder: 45 - profile: rabbitmq label: RabbitMQ agentKey: rabbitmq storeVisible: true storeOrder: 46Kafka、RocketMQ、RabbitMQ 共享同一个 DBX 连接模型与管理界面,因此是mq类型的三个 profile;而 MQTT 由于协议、配置模型和 UI 工作流均不同,保持为独立连接类型。字段说明:
profile:profile 标识,与前端 catalog 的id对应;agentKey:绑定到独立 Agent(仓库agents/drivers/下分别有kafka、rocketmq、rabbitmq驱动);storeVisible/storeOrder:该 profile 是否在驱动商店可见及展示顺序。
驱动商店排序另有约定(README 强调):driverStoreOrder用于描述符的主 Agent(primary Agent),storeOrder用于可见 profile 或被托管的驱动;两者必须是正数,且在有效 driver key 范围内唯一。MongoDB 描述符中的driverStoreOrder: 41就是主 Agent 排序的实例。
三、前端 profile:连接选择器如何绑定产品
profiles/catalog.yaml 定义前端连接选择器(connection picker)的产品级 profile。每个 profile 绑定dbType、产品label、图标、默认端口、默认用户与分类。核心字段:
| 字段 | 说明 | 示例 |
|---|---|---|
id | profile 唯一 ID | mysql、tidb、kafka |
dbType | 绑定的稳定连接类型 | mysql、mq |
label | 产品展示名 | TiDB、Apache Kafka |
icon/pickerIcon | 图标资源名 | mysql、pulsar |
port | 默认端口 | 3306、4000、9092 |
user | 默认用户名 | root、postgres、sa |
host | 默认主机(云端服务常见) | dynamodb.us-east-1.amazonaws.com |
urlParams | 默认 URL 参数 | auth=NONE、auth=noSasl |
category | 分类:sql/analytics/domestic/document/graph_ai/lightweight/timeseries/mq/registry_config | sql |
catalog 充分体现了"一个连接类型对应多个产品"的复用模式:
- MySQL 家族:
mysql、mariadb、tidb、oceanbase、tdsql、polardb、greatsql、doris、selectdb、starrocks、dolt、custom_mysql全部绑定dbType: mysql,仅默认端口/用户不同(TiDB 4000、OceanBase 2883、Doris/StarRocks 9030); - PostgreSQL 家族:
postgres、cloudberry、opentenbase、cockroachdb、custom_postgres绑定dbType: postgres; - MQ 家族:
mq(Pulsar)、kafka、rocketmq、rabbitmq绑定dbType: mq,各有独立图标与默认端口; - 国产数据库:
dm(达梦)、kingbase(金仓)、highgo(瀚高)、uxdb(优炫)、yashandb(崖山)、vastbase(海量)、goldendb、gbase、sundb、oscar、xugu、kwdb、opengauss、gaussdb等归入domestic分类; - 特殊 profile:
mongodb-legacy、h2-legacy、etcd-v2、gbase8a/gbase8s、influxdb3、jdbcx等对同一dbType提供旧版本或变体入口。
四、代码生成:YAML 如何驱动 Rust 与 TypeScript
描述符不是运行时被解析的"配置",而是编译期生成代码的输入。整条链路如下:
4.1 生成命令与衍生文件
README 给出显式命令(用于故障排查或手动刷新,日常开发无需手动执行):
pnpm generate:connection-types该命令实际执行node scripts/sync-connection-types.mjs(见 package.json),校验 YAML 并重写以下衍生文件:
| 衍生文件 | 内容 |
|---|---|
crates/dbx-core/assets/database-drivers.manifest.json | 嵌入式驱动清单 |
apps/desktop/src/types/generated/databaseTypes.ts | 前端dbType类型列表 |
apps/desktop/src/types/generated/connectionProfiles.ts | 前端连接 profile 类型 |
这些衍生文件是提交进仓库的产物,禁止直接手改——任何改动都会在下次生成时被覆盖。
4.2 自动触发生成
- 普通 Vite 开发/构建、前端 typecheck、前端测试会自动重新生成衍生文件;
- Vite 在开发期间会监听描述符目录,YAML 变化后自动重新生成(README 明确说明);
package.json中pretypecheck与pretest都声明了pnpm generate:connection-types,保证校验前产物最新。
4.3 只读校验:CI 兜底
pnpm check:connection-types # 同校验但不修改文件 pnpm check # 顶层 check,自动包含只读校验pnpm check:connection-types执行相同校验但不修改任何文件;pnpm check会在 CI 中自动运行该只读检查。这意味着如果仓库中提交的衍生文件过期(与 YAML 不一致),CI 校验会直接失败——从机制上杜绝"改 YAML 忘生成"的遗漏。
4.4 Rust 侧生成:DatabaseType 枚举
Cargo 在构建时读取同一份 YAML 描述符。虽然crates/dbx-core下没有build.rs,实际生成发生在 crates/dbx-types/build.rs,其中调用generate_connection_type_registry,读取../../plugins/connection-types目录,在构建输出目录生成DatabaseType枚举及其实现(pub enum DatabaseType+impl DatabaseType)。由此可以推断:
- 前端与 Rust 两端共享同一份 YAML 事实来源,
dbType与rustVariant的对应关系保证序列化 API 与类型安全的双重稳定; - README 中"
dbType与DatabaseType保留历史名称"正是为了这条编译链路上的兼容性约束。
五、何时新增连接类型:决策准则
README 最后给出了清晰的边界判断,这是实际开发中最重要的部分:
大多数情况下只需要一个 catalog 条目 + 图标(即"兼容产品 profile")。例如 MariaDB、TiDB、Doris、StarRocks 都不需要新代码,只需在 profiles/catalog.yaml 中添加 profile 并绑定dbType: mysql。
连接类型本身需要新代码,当且仅当其以下任一维度与既有实现不同:
- 协议(protocol)
- 认证方式(authentication)
- 连接字段(connection fields)
- 元数据提供者(metadata provider)
- 查询执行器(query executor)
- UI 工作流(UI workflow)
三条硬性约束(README 原文要点):
formKind是有限编码的连接表单种类,不是任意 YAML 表单引擎——新增表单必须先有对应代码实现;- 协议兼容的产品应绑定既有 dialect,复用最近的 connector 或 Agent,而不是再引入一套独立实现;
specializedSurface: true仅当产品使用共享能力矩阵之外的专用管理面时设置,否则至少启用一项产品能力。
仓库中大量描述符正是这一准则的实践:mq.yaml一个类型承载三个消息队列产品,mysql.yaml被十几个产品复用,而mqtt.yaml因协议/配置/UI 全不同而独立成类型。
六、总结
DBX 的连接类型注册体系可以概括为"一份 YAML,三端共享,两处生成":
- 一份 YAML:
plugins/connection-types/*.yaml是连接类型注册的单一事实来源,profiles/catalog.yaml负责前端产品绑定; - 三端共享:Rust 内核(
DatabaseType枚举与 manifest)、前端(databaseTypes.ts/connectionProfiles.ts)、Agent/驱动商店(agentKey/driverStoreOrder)共享同一份描述符语义; - 两处生成:
pnpm generate:connection-types生成前端类型与 manifest JSON,Cargo 构建时由 crates/dbx-types/build.rs 生成 Rust 枚举,且pnpm check:connection-types保证提交的衍生产物永不失真。
对于想要为 DBX 扩展新数据源的开发者,正确的路径是:先在 plugins/connection-types 下评估现有连接类型是否可复用,优先以 catalog profile + 图标完成接入;只有在协议、认证、连接字段、元数据、查询执行或 UI 工作流确实不同的场景下,才新增独立描述符并同时考虑方言绑定(plugins/dialects)与 Agent/驱动实现(agents/drivers)。这套"先复用、后新建"的约束,正是 DBX 在保持轻量(约 15MB)的同时支撑数十种数据源的架构基础。
- 数据库
- 开发者工具
- 桌面应用
- CLI
- MCP 服务
- AI 应用
【免费下载链接】dbx
15MB,轻量级跨平台数据库客户端、数据库管理工具。支持 MySQL、PostgreSQL、SQLite、Redis、MongoDB、DuckDB、ClickHouse、SQL Server 等。15MB, lightweight, cross-platform database client. Supports MySQL, PostgreSQL, SQLite, Redis, MongoDB, DuckDB, ClickHouse, SQL Server and more.
相关推荐
DBX 连接类型注册体系详解:从 YAML 描述符到三端生成的连接注册链路
DBX 连接类型注册体系详解:从 YAML 描述符到三端生成的连接注册链路 plugins/connection types/ .yaml 是 DBX 项目连接
数据库客户端数据库桌面应用CLI后端MCP 服务AI 应用dbx 桌面端 tauri-plugin-updater 权限体系详解:从权限标识符到前端命令的完整链路
dbx 桌面端 tauri plugin updater 权限体系详解:从权限标识符到前端命令的完整链路 本文以 tauri plugin updater 权限
数据库开发者工具桌面应用CLIMCP 服务AI 应用Open SWE 模型、Profile 与指令体系全解:从模型注册表到线程快照的完整决策链
Open SWE 模型、Profile 与指令体系全解:从模型注册表到线程快照的完整决策链 在 Open SWE 中,一次 hosted agent 运行的启动
人工智能AI Agent代码智能体后端前端桌面应用
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考