Files
hotime/.cursor/plans/修复dm列注释读取_2231760d.plan.md
T
hoteas 3681564ca4 feat(config): 扩展数据类型映射与数据库字段备注提取功能
- 在 ColumnDataType 中新增对 PostgreSQL 和 Oracle 数据类型的支持
- 更新 Db2JSON 方法,优化对达梦数据库表和列信息的查询逻辑
- 增强字段备注解析,支持从备注中提取提示信息并清理标签
- 更新文档,详细说明字段备注格式及前端提示的展示效果
2026-03-23 16:48:56 +08:00

2.6 KiB
Raw Blame History

name, overview, todos, isProject
name overview todos isProject
修复DM列注释读取 修复达梦数据库列注释(COMMENT)未被正确读取的问题,导致管理端所有字段显示为数据库字段名而非中文备注。
id content status
fix-dm-col-comments 修改 makecode.go 列信息查询,列注释改用 USER_COL_COMMENTS 替代 ALL_COL_COMMENTS completed
false

修复达梦数据库列注释读取失败

问题分析

通过 MCP 查询 adminDB.json 确认:所有表的字段 label 全部等于字段名本身(如 "id", "name", "phone"),没有中文备注。但表级 label 正常(如"消息主表"、"用户表")。

用户确认数据库字段确实有备注。

根因

makecode.go 第 170 行当前的列查询 SQL

FROM ALL_TAB_COLUMNS c 
LEFT JOIN ALL_COL_COMMENTS m 
  ON c.TABLE_NAME=m.TABLE_NAME AND c.COLUMN_NAME=m.COLUMN_NAME AND c.OWNER=m.OWNER
WHERE c.TABLE_NAME='...' AND c.OWNER='ZWBG'

LEFT JOIN 条件中 c.OWNER=m.OWNER 要求 ALL_COL_COMMENTSOWNER 也等于 'ZWBG'。但在 DM 中,ALL_COL_COMMENTSOWNER 值可能与 ALL_TAB_COLUMNS 不一致(DM 的 Oracle 兼容视图在 OWNER 语义上可能存在差异),导致 JOIN 匹配不上,m.COMMENTS 全部为 NULL。

对比:表注释用的 ALL_TAB_COMMENTS WHERE OWNER='ZWBG' 能正确返回中文备注,说明表级视图的 OWNER 一致,但列级视图可能不同。

修复方案

修改 makecode.go 第 169-171 行,列注释改用 USER_COL_COMMENTS(自动使用当前 schema 上下文 ZWBG,无需 OWNER 过滤),列元数据继续用 ALL_TAB_COLUMNS(保留 OWNER 过滤防止系统表):

if db.Type == "dm" || db.Type == "dameng" {
    tableInfo = db.Query(`SELECT c.COLUMN_NAME AS "name", c.DATA_TYPE AS "type", m.COMMENTS AS "label", c.NULLABLE AS "must", c.DATA_DEFAULT AS "dflt_value" FROM ALL_TAB_COLUMNS c LEFT JOIN USER_COL_COMMENTS m ON c.TABLE_NAME=m.TABLE_NAME AND c.COLUMN_NAME=m.COLUMN_NAME WHERE c.TABLE_NAME='` + v.GetString("name") + `' AND c.OWNER='` + strings.ToUpper(db.DBName) + `' ORDER BY c.COLUMN_ID`)
}

关键变化:

  • ALL_COL_COMMENTS 改为 USER_COL_COMMENTS
  • 去掉 JOIN 中的 AND c.OWNER=m.OWNERUSER_COL_COMMENTS 没有 OWNER 列)
  • WHERE 条件 c.OWNER='ZWBG' 保留(作用于 ALL_TAB_COLUMNS,防止系统表列混入)

原理:框架连接 DM 用 ?schema=ZWBGUSER_COL_COMMENTS 自动返回当前 schema(ZWBG)的列注释,绕开了 OWNER 不一致问题。