Repository navigation
v0.4.0
这一版的主题是把元数据读取交给用户写的 SQL,并且让你看得见它在做什么。前几轮反馈里最重要的一条
是“有些库展开一张表要等几分钟”—— 而慢的不是 SQL,是围着它的 DatabaseMetaData 读取。所以这一版做两件事:
凡是能换成用户自己写的语句的读取都开出来(现在覆盖模式/表/列/索引/目录/表类型六种,外加 DDL),以及
把“跑的是哪条语句、花在哪个调用、哪张表上”落到日志与健康报告里。
新增
- 连接树上显示表/视图的中文名。数据库给了表注释时,注释跟在表名后面(
orders 订单),悬浮提示里
是完整注释和附加字段。标签仍是物理名 —— 那才是要写进 SQL 的东西。树的筛选也匹配注释,
于是输入“订单”能找到orders(之前只比名称,中文名等于白写) - 元数据规则可以带回表注释和任意附加字段。别名成
REMARKS/TABLE_COMMENT/COMMENT的列被
认作表注释(多列都有值时按此顺序取),它随后出现在树上、参与筛选、并可作为${remark}用于自定义
动作与 DDL 规则;select 出来的其它列不再被丢弃,按你 select 的顺序(不是字母序)显示在节点的
悬浮提示里,形如EST_ROWS: 12000。这才是这个设置真正可扩展的地方:目录表里有用的字段,
不用等插件认识那个库 - 示例规则新增 MySQL 一档,PostgreSQL/openGauss 的例子改用
pg_catalog—— 比information_schema
快得多,而且只有它能取到表注释,也就是中文 schema 上人真正认得的那个名字 metadata.queries现在也能替掉列与索引的读取(kind: "columns"/"indexes")。之前只有
schemas/tables能自定义,而真正让树变慢的恰恰是每张表一次的getColumns:展开一张表、
补全缓存填充、Show Columns 各算一次。列规则能表达树会显示的每一件事(COLUMN_NAME、TYPE_NAME、
COLUMN_SIZE/DECIMAL_DIGITS、IS_NULLABLE、COLUMN_DEF、REMARKS、ORDINAL_POSITION、
IS_PRIMARY_KEY、IS_AUTOINCREMENT、IS_GENERATEDCOLUMN),索引规则是INDEX_NAME、
NON_UNIQUE、COLUMN_NAME、ORDINAL_POSITION、ASC_OR_DESC、TYPE_NAME、CARDINALITY;
没给的字段取诚实默认(类型 →UNKNOWN、可空性 → 未知(显示?)、JDBC 类型 →OTHER、
序号 → 结果行序),而不是编一个- 字面量占位符
${tableLiteral}/${schemaLiteral}/${catalogLiteral}/
${namePatternLiteral}:自带单引号并转义值里的引号。这些值是数据,自己往引号里塞的名字
遇到一张叫it's的表就变成了另一条语句。示例里全部改成= ${tableLiteral} catalogs与tableTypes也开了(原来只剩这两个读取不能自定义)。它们各是一次性的小结果、
平时不慢,所以理由是"万一你那个驱动在这里返回了没用的东西":目录列表把连不上的库也列出来、
表类型一个都不给。两者都不需要占位符(跑到它们时还不知道能按什么过滤),tableTypes的
kind 大小写都认(存下来的是规范拼写),名字列表会去重、空白条目按"没给"处理- 新增
columns示例(PostgreSQL/openGauss 走pg_attribute+format_type+col_description,
MySQL 走information_schema.columns)与 MySQL 的indexes示例。PG 的索引例子故意不给:
列出索引的列需要unnest ... WITH ORDINALITY或LATERAL,而这正是那些较老的
PostgreSQL 兼容库(本功能最想服务的对象)没有的语法,当示例发出去就会在它们上面报错
变更
- 自定义动作与 DDL 规则的占位符新增
${remark}(表注释;在列上是列注释),以及元数据规则带回来的
任何附加字段 —— 别名EST_ROWS就是${EST_ROWS}。${remark}和${column}一样填不出来就跳过
模板,而不是当成空串:按中文名查对象的语句少了这个名字,查出来的就是别的东西。附加字段里与
占位符重名的(table、schema这种)会被丢掉,否则一条奇怪的规则就能改掉所有模板指向的表 - 这些值都从节点上直接取,不再为了拿一个界面上已经显示出来的注释而多跑一次查询
- 每条元数据规则跑的到底是哪条 SQL,现在看得出来:命中规则时输出通道写一行(规则名 + 占位符已
填好的语句),没命中而回落驱动时写一行debug。规则是用户写的 SQL、却是插件选中的,而设置里那条
语句并不是发给数据库的那条(占位符被填过) —— 所以它和别的语句一样要能被查出来 - 导出时因
export.csv.quoting=never而留下的「有字段没加引号」提示,除了弹窗还写进
DB Client 输出通道 —— 弹窗几秒就消失,而这件事关系到已经落盘的文件,日志里还带着完整路径 - 列注释的读取不再每次都付费。注释是结果里每张表一次
getColumns换来的,而这正是几个慢库
上「查询慢」的真正原因,所以:① 只有会显示注释的调用才去读(结果网格、表预览、DDL 结果、导出表头),
树与补全的元数据读取一律不读;② 读到的结果按「连接 + URL + 表」在会话内缓存(LRU,上限 512 张表,
空结果也缓存 —— 不然"这张表没有注释"会变成每次查询都重来一次慢调用);③ 新增
result.columnRemarks(默认true),关掉后结果与导出只显示物理列名,一次元数据调用都不发 - 健康报告新增「元数据调用」:按
tables/columns/schemas/indexes/ddl统计次数、总耗时、
平均耗时与失败数,并列出最慢的几次读取及其对象(columns public.orders 12.3 s)。原来的
查询指标只回答「这条语句跑了多久」—— 而当时间根本没花在语句上时(慢驱动的getColumns是几
分钟的目录查询),看上去就像数据库慢。现在能把那笔开销指到具体的调用和具体的表上,也才有得选:
换掉它(metadata.queries)或关掉它(result.columnRemarks)。统计在每个元数据读取的唯一
入口采集,所以新增的读取不可能漏掉
新增(仅开发,不影响扩展行为)
scripts/check-i18n.mjs:界面文案以英文原文为键,漏译不会报错,只会让中文用户在一句中文里
看到一句英文 —— 这是只有那个语言的用户才会先看见的错。脚本扫src/**与media/**里的每个
t('...')字面量(连同'a' + 'b'拼接与转义),要求目录里都有条目;读不出来的调用必须列进白名单,
白名单里还要写清它可能产生哪几个键,否则白名单会退化成一句谁都看不懂的eslint-disable。
目录里多余的键只警告不失败。已接入npm test(npm run checks= 文档 + 文案)CommentCacheTests:3 项针对列注释缓存的测试 —— 空结果必须被记住(否则每次查询都要重新付出
那笔慢调用)、超出上限时丢的是最久没用过的那条、没读过的表不能假装知道MetadataMetricsTests:5 项针对元数据计时的测试 —— 按调用名汇总、按总耗时而不是次数排序
(一百次 1 毫秒的调用不该盖过一次 5 秒的)、失败与成功分开计、只记住最慢的 20 次且汇总不受上限影响- 示例规则真的在真库上跑过了:PostgreSQL 16 与 MariaDB 11 各起一个容器,建一张带注释、主键、
serial/auto_increment 与索引的表,把每个示例按占位符展开后丢进去。两个库里columns示例都带回了
主键与注释、IS_AUTOINCREMENT也都对(nextval/extra LIKE '%auto_increment%'),indexes示例
把NON_UNIQUE的 0/1 与index_type都带了回来 —— 这些是单元测试没法证明的部分 - 新增一项测试把示例与读取端钉在一起:列/索引示例里每个
AS 别名都必须是读取端真正会读的名字
(直接拿COLUMN_ROW_COLUMNS/INDEX_ROW_COLUMNS对照)。服务器能告诉你语句跑得通,但告诉不了你
插件读不读这个别名 —— 一个写成IS_PK的规则会安静地少一个主键图标。表规则不参与这项检查:
那里的额外列是特性(EST_ROWS会被保留并显示)