Skip to content

v0.4.0

Choose a tag to compare

@github-actions github-actions released this 30 Sep 02:00
· 27 commits to main since this release

这一版的主题是把元数据读取交给用户写的 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 会被保留并显示)