资讯动态

dbgate-types 全解析:DbGate 数据库管理器的 TypeScript 类型系统与驱动契约

发布时间:2026/10/15 16:56:56 来源:尧图企业网站定制
数据库数据库客户端桌面应用后端【免费下载链接】dbgateDatabase manager for MySQL, PostgreSQL, SQL Server, MongoDB, SQLite and others. Runs under Windows, Linux, Mac or as web application项目地址https://gitcode.com/gh_mirrors/db/dbgate点击查看免费下载导读DbGate 是一个支持 MySQL、PostgreSQL、SQL Server、MongoDB、SQLite 等数十种数据库的统一管理工具其多引擎架构之所以能保持清晰一致关键在于一个独立的纯类型包——dbgate-types。本文以 packages/types/README.md 为骨架逐一拆解数据库结构dbinfo、SQL 方言dialect、SQL 生成器dumper、引擎驱动engines、查询结果query与插件扩展extensions六大类型域并结合仓库源码说明这些类型契约如何被真实驱动与工具链消费。读完本文你将掌握 DbGate 类型系统各文件的作用边界、核心接口字段语义以及如何基于这些类型开发自己的引擎驱动或插件。一、定位与安装一个只有类型、没有运行时的包dbgate-types是 DbGate 的 TypeScript 类型定义包正如其 README 所述Typescript definitions for DbGate app。它的存在让不同引擎驱动MySQL、PostgreSQL、Redis、Cassandra、DuckDB……在编译期共享同一套结构描述避免每个插件各自定义一份表结构或驱动接口。从 packages/types/package.json 可以看到几个关键设计特征types: index.d.ts类型入口指向index.d.ts所有子模块通过它聚合导出main: 没有运行时 JavaScript 实现是纯粹的声明文件包typeScriptVersion: 2.8声明了对较老 TS 版本的兼容。安装方式即 README 给出的命令yarn add --dev dbgate-types作为开发期依赖安装即可因为发布产物是类型声明不影响最终运行。需要注意README 中列出了 6 个核心类型文件而实际的 packages/types/index.d.ts 通过export * from聚合导出了 10 个模块engines、dbinfo、query、dialect、dumper、dbtypes、extensions、alter-processor、appdefs、filter-type、test-engines比 README 清单更完整下文会逐一覆盖。二、dbinfo.d.ts数据库结构描述的公共骨架dbinfo.d.ts 是整个类型系统的基础定义了 DbGate 眼中一个数据库长什么样。核心设计思想是所有对象都继承NamedObjectInfo统一携带pureName对象名与可选的schemaName模式名。表与列TableInfo聚合了表的全部要素columns列数组、primaryKey主键、foreignKeys外键、indexes索引、uniques唯一约束、checks检查约束以及tableEngine、tableRowCount等物理信息。ColumnInfo则完整描述一列export interface ColumnInfo extends NamedObjectInfo { columnName: string; notNull?: boolean; autoIncrement?: boolean; dataType: string; displayedDataType?: string; precision?: number; scale?: number; length?: number; computedExpression?: string; isPersisted?: boolean; defaultValue?: string; columnComment?: string; isUnsigned?: boolean; hasAutoValue?: boolean; // ... }这些字段映射了不同数据库的列特征precision/scale/length对应数值与字符类型的尺寸computedExpression对应生成列isUnsigned/isZerofill是 MySQL 特有标志defaultConstraint用于 SQL Server 的命名默认约束。约束体系约束通过ConstraintInfo统一建模constraintType收窄为六种primaryKey | foreignKey | sortingKey | index | check | unique。其中ForeignKeyInfo额外带有refSchemaName、refTableName与updateAction/deleteAction级联行为IndexInfo携带isUnique、indexType与 SQL Server 过滤索引的filterDefinitionCheckInfo直接保存definition表达式。非关系型对象集合、过程与触发器DbGate 不仅管理关系型数据库还通过CollectionInfo描述 Cassandra 这类文档/宽列存储partitionKey分区键、clusterKey分区内聚簇键、uniqueKey与autoValueColumns共同构成集合的键体系。ProcedureInfo/FunctionInfo通过CallableObjectInfo携带parameters参数模式由ParameterMode IN | OUT | INOUT | RETURN限定TriggerInfo用联合类型刻画触发时机BEFORE/AFTER/INSTEAD OF/每行/语句级与eventTypeINSERT/UPDATE/DELETE/TRUNCATE。整个数据库与精简版变体DatabaseInfo继承DatabaseInfoObjects后者把tables、collections、views、matviews、procedures、functions、triggers、schedulerEvents全部收拢——这正是 packages/tools/src/database-info-alter-processor.ts 中this.db.tables.push(...)、this.db[obj.objectTypeField]等操作的直接依据。文件末尾还提供了ColumnInfoTiny/TableInfoTiny/DatabaseInfoTiny等紧凑变体用单字母字段n表示 name、t表示 type压缩结构体积用于 JSON 序列化传输场景。三、engines.d.ts引擎驱动必须实现的完整契约engines.d.ts 定义了EngineDriverTClient, TDataBase接口——这是每个数据库插件后端最核心的契约。在真实插件中它被以 JSDoc 形式显式引用例如 plugins/dbgate-plugin-mysql/src/backend/drivers.js 第 80 行的/** type {import(dbgate-types).EngineDriver} */为纯 JavaScript 插件提供类型提示与约束。生命周期连接、查询与关闭驱动必须实现的最基本方法包括connect({ server, port, user, password, database, connectionDefinition }): PromiseDatabaseHandle; close(dbhan): Promiseany; query(dbhan, sql, options?): PromiseQueryResult; stream(dbhan, sql, options: StreamOptions); readQuery(dbhan, sql, structure?): PromiseStreamResult; writeQueryFromStream(dbhan, sql): PromiseStreamResult; writeTable(dbhan, name, options: WriteTableOptions): PromiseStreamResult;其中DatabaseHandle是驱动与底层客户端库之间的桥接client持有原生连接对象如 mysql2 的 Connectiondatabase记录当前库名feedback用于回传消息。StreamOptions定义了recordset/row/error/done/info等回调支撑查询结果的分块流式传输StreamResult则允许返回单个stream.Readable或可读/可写流的组合。能力开关用布尔字段声明支持什么EngineDriver中包含大量能力声明字段前端 UI 与后端流程据此自动调整行为例如supportsTransactions/implicitTransactions是否支持事务、是否无需显式 BEGIN TRANSACTIONsupportsEditableQueryResults查询结果是否可直接编辑supportsDatabaseUrl连接是否可用 URL 表示如mongodb://supportsNativeBackup/supportsNodejsBackup备份走原生命令行工具还是 Node.js 实现supportsServerSummary是否支持进程/变量/数据库汇总面板singleConnectionOnly是否只允许单连接premiumOnly是否仅专业版可用。这些开关直接决定了 packages/web 前端界面中哪些按钮、标签页、表单选项对当前引擎可见也是连接表单动态渲染showConnectionField/showConnectionTab的依据。结构分析analyseFull 与 analyseIncremental驱动通过analyseFull(dbhan, serverVersion)返回完整DatabaseInfo通过analyseIncremental在已有结构上增量补齐配合analyseSingleObject/analyseSingleTable支持按需加载单个对象。incrementalAnalysis的能力由supportsIncrementalAnalysis声明。此外getVersion、listDatabases、listSchemas等服务于连接树的构建。集合操作、脚本与杂项CollectionOperationInfo用可辨识联合类型描述 create/drop/rename/clone 集合四种操作readCollection/updateCollection/getCollectionUpdateScript支撑 NoSQL 集合浏览与编辑getQuerySplitterOptions按用途stream/script/editor/import提供 SQL 拆分规则getScriptTemplates提供建表/建视图等脚本模板createSaveChangeSetScript让驱动有机会覆盖默认的变更集 SQL 生成逻辑。四、dialect.d.tsSQL 方言的能力差异描述packages/tools/src/SqlDumper.ts 导入的类型表明SqlDumper的构造器接收EngineDriver并读取driver.dialect。方言描述对象 dialect.d.ts 用大量布尔开关刻画这家数据库的 SQL 长什么样分页风格rangeSelectLIMIT/OFFSET、topRecordsTOP n、rowNumberOverPaging、offsetFetchRangeSyntaxSQL Server OFFSET…FETCH、offsetFirstSkipSyntaxMongo 风格 skip 在前标识符与字符串quoteIdentifier(s)定义标识符引号规则反引号 vs 双引号、stringEscapeChar定义字符串转义符、maxIdentifierLength限制标识符长度结构变更能力createColumn/dropColumn/changeColumn/createIndex/createForeignKey/createPrimaryKey/renameTable等一长串布尔开关决定表编辑器允许哪些操作兼容性开关requireFromDualOracle 的FROM DUAL、userDatabaseNamePrefixOracle 的c##、upperCaseAllDbObjectNames、disableAutoIncrement、defaultValueBeforeNullability默认值在 NOT NULL 之前还是之后数据类型predefinedDataTypes列出可选类型集合fallbackDataType是兜底类型defaultNewTableColumns给出新建表时的默认列。getTableFormOptions(intent)根据newTableForm/editTableForm/sqlCreateTable/sqlAlterTable四种场景返回表选项列表createColumnViewExpression则用于在 SQL 树层面生成列视图/过滤表达式。五、dumper.d.ts 与 alter-processor.d.tsSQL 生成与结构变更的统一抽象SqlDumper跨引擎的 SQL 命令生成器README 对 dumper 的定义是dump SQL commands independed on DB engine。 dumper.d.ts 中的SqlDumper接口同时继承AlterProcessor提供了一组 DSL 式方法putRaw(s); // 直接追加原始文本 put(format, ...args); // 格式化追加含关键字大小写转换 putCmd(format, ...args);// 追加一条命令 putValue(value, dataType?); // 追加字面量值字符串、数字、日期、二进制 putCollection(delimiter, collection, lambda); // 用分隔符拼接集合 transform(type, dumpExpr); // 对日期/时间做 GROUP:YEAR 等变换真实的类实现在 packages/tools/src/SqlDumper.tsSqlDumper implements AlterProcessor其putValue方法把null渲染为^null占位符、布尔值渲染为1/0、日期渲染为 ISO 字符串并把$binary.base64形式的二进制数据转换为^null占位。文件开头还展示了keywordsCase静态开关——生成的关键字可整体大写或小写以满足不同库的审美与规则。AlterProcessor把结构变更变成操作序列alter-processor.d.ts 定义的AlterProcessor是结构与 SQL 之间的桥梁方法覆盖建/删表、增/改/删列、增/改/删约束、重命名表/对象/列/约束、重建表recreateTable、创建/删除 SQL 对象以及fillPreloadedRows用预载行填充表。它有两个重要实现一个是 packages/tools/src/alterPlan.ts 中收集变更操作并在run(processor)时逐一派发的计划对象runAlterOperation(op, processor)另一个是 packages/tools/src/database-info-alter-processor.ts 中的DatabaseInfoAlterProcessor它把createTable实现为this.db.tables.push(table)、dropColumn实现为从table.columns中移除匹配列——即把变更计划作用到内存数据库结构上用于预览变更结果而SqlDumper则把同样的操作渲染成真实 SQL。这种同一套操作接口两种执行目标的设计是 DbGate 表结构编辑器预览 SQL 再执行特性的底层支撑。六、query.d.ts查询结果与结构化过滤条件query.d.ts 定义了查询结果与过滤条件的标准形态。QueryResult很轻量rows?数据行数组、columns?QueryResultColumn[]含columnName、notNull、isPrimaryKey、dataType、tableName、sourceColumnName等元数据、rowsAffected?。更值得注意的是它内置了一套与具体数据库无关的过滤条件 AST——FilterCondition是可辨识联合类型由BinaryCondition、!、、、、、、AndCondition/OrCondition组合、NullConditionisNull/isNotNull、NotCondition、LikeCondition、PredicateConditionexists/emptyArray 等、InCondition组合而成。FullQueryOptions则把condition、sort、limit、skip打包成一个完整的分页查询参数对象被前端数据网格与数据导出流程共用。这套 AST 的实际消费方是 packages/filterparser 的parseFilter与filterTool它们把用户输入的过滤表达式解析成FilterCondition再由各引擎翻译为原生查询。七、filter-type.d.ts过滤器行为的能力描述filter-type.d.ts 定义了FilterBehaviour——它不是过滤条件本身而是某种数据类型支持哪些过滤操作的能力矩阵supportEquals、supportStringInclusion、supportNullTesting、supportSqlCondition、supportEmptyArrayTesting、allowStringToken、allowNumberDualTesting、passBooleans等开关决定了过滤输入框中哪些运算符可选。EngineDriver要求驱动实现FilterBehaviourProvider.getFilterBehaviour(dataType, standardFilterBehaviours)后者传入标准行为集。标准集定义在 packages/tools/src/filterBehaviours.tsnumberFilterBehaviour、stringFilterBehaviour、logicalFilterBehaviour、datetimeFilterBehaviour、mongoFilterBehaviour、firestoreFilterBehaviours、evalFilterBehaviour七种并聚合为standardFilterBehaviours字典。以mongoFilterBehaviour为例它开启了数组存在性测试、ObjectId 测试与passBooleans与 Mongo 的查询语义一一对应。八、extensions.d.ts、appdefs.d.ts 与 test-engines.d.ts插件、应用与测试extensions插件系统的四种注册物extensions.d.ts 定义了ExtensionsDirectory它是插件运行时注册表的静态形态包含四类成员plugins: PluginDefinition[]——插件本体包名 manifest contentfileFormats: FileFormatDefinition[]——文件格式定义storageType、extension、readerFunc/writerFunc如 CSV、JSONL、ExcelquickExports: QuickExportDefinition[]——快速导出格式drivers: EngineDriver[]——插件贡献的引擎驱动。FileFormatDefinition的addFileToSourceList/getDefaultOutputName/getOutputParams钩子让文件格式能参与导入向导的源选择与目标命名流程。appdefs业务应用的静态描述appdefs.d.ts 描述的是 DbGate 的应用Application概念——一组面向特定业务场景的虚拟外键、字典描述与查询文件。ApplicationDefinition包含appid、applicationName、usageRules通过服务主机/库名/表名/列名的正则或列表精确圈定适用数据库、virtualReferences虚拟外键、dictionaryDescriptions字典字段描述与files内置查询/命令。前端 packages/web/src/utility/appTools.ts 第 1 行即import type { ApplicationDefinition, DatabaseInfo, StoredConnection } from dbgate-types其filterAppsForDatabase函数逐条执行usageRules的匹配逻辑决定当前数据库应该显示哪些应用。test-engines跨引擎集成测试的驱动清单test-engines.d.ts 定义了TestEngineInfo与TestObjectInfo为仓库的跨引擎集成测试提供类型化配置包括连接参数engine/server/databaseUrl/port、海量的skip*能力开关skipOnCI、skipIndexes、skipTriggers、skipDataReplicator、skipDeploy……、dumpChecks执行 SQL 并断言结果、parameters/triggers/schedulerEvents的建/删脚本与期望结构以及objects中成对的 create/drop 测试对象。真实使用见 integration-tests/engines.js文件顶部即以/** type {import(dbgate-types).TestEngineInfo} */标注各引擎配置如 MySQL 的dumpFile: data/chinook-mysql.sql、binaryDataType: blob、dumpChecks: [{ sql: select count(*) as res from genre, res: 25 }]并以create1/create2/drop1/drop2成对定义过程、调度事件等对象的测试脚本。九、如何基于 dbgate-types 开发一个驱动综合以上契约开发一个新引擎驱动的最小骨架可概括为四步参照 plugins/dbgate-plugin-mysql/src/backend/drivers.js 与各插件目录dbgate-plugin-*的组织方式实现EngineDriver先声明engine、title、defaultPort、databaseEngineTypes与能力开关再实现connect/query/stream/close生命周期JS 实现可用/** type {import(dbgate-types).EngineDriver} */获得编译期检查提供dialect按引擎语法填写分页风格、标识符引号、DDL 能力开关与predefinedDataTypes提供createDumper返回基于SqlDumper的 SQL 生成器或复用 packages/tools/src/SqlDumper.ts 的通用实现并覆写差异点实现analyseFull等分析方法返回符合DatabaseInfo的结构并实现getFilterBehaviour以启用对应的过滤能力。整个过程都由dbgate-types的类型声明兜底保证所有插件对上层应用暴露一致的接口面。结语dbgate-types虽然只有 12 个.d.ts文件、没有任何运行时代码却是 DbGate 多引擎架构的宪法dbinfo定义世界模型engines定义能力契约dialect与dumper/alter-processor定义 SQL 生成规则query与filter-type定义数据交互形态extensions/appdefs/test-engines定义生态与质量保障。无论你是想为 DbGate 贡献新驱动、开发插件还是研究其架构设计从研读这些类型文件入手都是最高效的路径。赞分享数据库数据库客户端桌面应用后端【免费下载链接】dbgateDatabase manager for MySQL, PostgreSQL, SQL Server, MongoDB, SQLite and others. Runs under Windows, Linux, Mac or as web application项目地址https://gitcode.com/gh_mirrors/db/dbgate点击查看免费下载相关推荐changesets 类型系统全解changesets/types 的类型契约与生态应用changesets 类型系统全解changesets/types 的类型契约与生态应用 导读 changesets/types 是 changesets开发工具CLIMAX Pipelines Modeling Types 全解析Max 推理管线的类型体系与协议契约MAX Pipelines Modeling Types 全解析Max 推理管线的类型体系与协议契约 导读 max.pipelines.modeling.ty人工智能大模型编程语言编译器标准库算子库模型推理服务模型量化Crawlee 类型系统全解读懂 crawlee/types 的公开 API 契约Crawlee 类型系统全解读懂 crawlee/types 的公开 API 契约 导读 Crawlee 是面向 Node.js 的网页抓取与浏览器自动化库后端网页爬虫创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑