From 14e0aadbba381705f0eb0cb804325b5d78c951a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E5=AE=97=E6=B4=8B?= Date: Wed, 13 Dec 2023 15:11:26 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E8=BE=BE=E6=A2=A6=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=BA=93=E6=93=8D=E4=BD=9Cbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/internal/db/dbm/dialect_dm.go | 74 +++++++++++++++------- server/internal/db/dbm/metasql/dm_meta.sql | 69 +++++++++++--------- 2 files changed, 90 insertions(+), 53 deletions(-) diff --git a/server/internal/db/dbm/dialect_dm.go b/server/internal/db/dbm/dialect_dm.go index a20d70bb..b247b00c 100644 --- a/server/internal/db/dbm/dialect_dm.go +++ b/server/internal/db/dbm/dialect_dm.go @@ -43,14 +43,14 @@ type DMDialect struct { } func (pd *DMDialect) GetDbNames() ([]string, error) { - _, res, err := pd.dc.Query("SELECT name AS dbname FROM v$database") + _, res, err := pd.dc.Query("SELECT name AS DBNAME FROM v$database") if err != nil { return nil, err } databases := make([]string, 0) for _, re := range res { - databases = append(databases, anyx.ConvString(re["dbname"])) + databases = append(databases, anyx.ConvString(re["DBNAME"])) } return databases, nil @@ -66,11 +66,11 @@ func (pd *DMDialect) GetTables() ([]Table, error) { tables := make([]Table, 0) for _, re := range res { tables = append(tables, Table{ - TableName: re["tableName"].(string), - TableComment: anyx.ConvString(re["tableComment"]), - CreateTime: anyx.ConvString(re["createTime"]), + TableName: re["TABLE_NAME"].(string), + TableComment: anyx.ConvString(re["TABLE_COMMENT"]), + CreateTime: anyx.ConvString(re["CREATE_TIME"]), TableRows: anyx.ConvInt(re["tableRows"]), - DataLength: anyx.ConvInt64(re["dataLength"]), + DataLength: anyx.ConvInt64(re["DATA_LENGTH"]), IndexLength: anyx.ConvInt64(re["indexLength"]), }) } @@ -95,14 +95,14 @@ func (pd *DMDialect) GetColumns(tableNames ...string) ([]Column, error) { columns := make([]Column, 0) for _, re := range res { columns = append(columns, Column{ - TableName: re["tableName"].(string), - ColumnName: re["columnName"].(string), - ColumnType: anyx.ConvString(re["columnType"]), - ColumnComment: anyx.ConvString(re["columnComment"]), - Nullable: anyx.ConvString(re["nullable"]), - ColumnKey: anyx.ConvString(re["columnKey"]), - ColumnDefault: anyx.ConvString(re["columnDefault"]), - NumScale: anyx.ConvString(re["numScale"]), + TableName: re["TABLE_NAME"].(string), + ColumnName: re["COLUMN_NAME"].(string), + ColumnType: anyx.ConvString(re["COLUMN_TYPE"]), + ColumnComment: anyx.ConvString(re["COLUMN_COMMENT"]), + Nullable: anyx.ConvString(re["NULLABLE"]), + ColumnKey: anyx.ConvString(re["COLUMN_KEY"]), + ColumnDefault: anyx.ConvString(re["COLUMN_DEFAULT"]), + NumScale: anyx.ConvString(re["NUM_SCALE"]), }) } return columns, nil @@ -135,12 +135,12 @@ func (pd *DMDialect) GetTableIndex(tableName string) ([]Index, error) { indexs := make([]Index, 0) for _, re := range res { indexs = append(indexs, Index{ - IndexName: re["indexName"].(string), - ColumnName: anyx.ConvString(re["columnName"]), - IndexType: anyx.ConvString(re["indexType"]), - IndexComment: anyx.ConvString(re["indexComment"]), - NonUnique: anyx.ConvInt(re["nonUnique"]), - SeqInIndex: anyx.ConvInt(re["seqInIndex"]), + IndexName: re["INDEX_NAME"].(string), + ColumnName: anyx.ConvString(re["COLUMN_NAME"]), + IndexType: anyx.ConvString(re["INDEX_TYPE"]), + IndexComment: anyx.ConvString(re["INDEX_COMMENT"]), + NonUnique: anyx.ConvInt(re["NON_UNIQUE"]), + SeqInIndex: anyx.ConvInt(re["SEQ_IN_INDEX"]), }) } // 把查询结果以索引名分组,索引字段以逗号连接 @@ -169,8 +169,38 @@ func (pd *DMDialect) GetCreateTableDdl(tableName string) (string, error) { if err != nil { return "", err } + // 建表ddl + var builder strings.Builder + for _, re := range res { + builder.WriteString(re["COLUMN_VALUE"].(string)) + } - return res[0]["COLUMN_VALUE"].(string), nil + // 表注释 + _, res, err = pd.dc.Query(fmt.Sprintf("select COMMENTS from USER_TAB_COMMENTS where TABLE_TYPE='TABLE' and TABLE_NAME = '%s'", tableName)) + if res != nil { + for _, re := range res { + // COMMENT ON TABLE "SYS_MENU" IS '菜单表'; + tableComment := fmt.Sprintf("\n\nCOMMENT ON TABLE \"%s\" IS '%s';\n", tableName, re["COMMENTS"].(string)) + builder.WriteString(tableComment) + } + } + + // 字段注释 + fieldSql := fmt.Sprintf(` + SELECT COLUMN_NAME, COMMENTS + FROM USER_COL_COMMENTS + WHERE OWNER = (SELECT SF_GET_SCHEMA_NAME_BY_ID(CURRENT_SCHID)) + AND TABLE_NAME = '%s' + `, tableName) + _, res, err = pd.dc.Query(fieldSql) + if res != nil { + for _, re := range res { + // COMMENT ON COLUMN "SYS_MENU"."BIZ_CODE" IS '业务编码,应用编码1'; + fieldComment := fmt.Sprintf("\nCOMMENT ON COLUMN \"%s\".\"%s\" IS '%s';", tableName, re["COLUMN_NAME"].(string), re["COMMENTS"].(string)) + builder.WriteString(fieldComment) + } + } + return builder.String(), nil } func (pd *DMDialect) GetTableRecord(tableName string, pageNum, pageSize int) ([]string, []map[string]any, error) { @@ -190,7 +220,7 @@ func (pd *DMDialect) GetSchemas() ([]string, error) { } schemaNames := make([]string, 0) for _, re := range res { - schemaNames = append(schemaNames, anyx.ConvString(re["schemaName"])) + schemaNames = append(schemaNames, anyx.ConvString(re["SCHEMA_NAME"])) } return schemaNames, nil } diff --git a/server/internal/db/dbm/metasql/dm_meta.sql b/server/internal/db/dbm/metasql/dm_meta.sql index 7549277b..3773b5a4 100644 --- a/server/internal/db/dbm/metasql/dm_meta.sql +++ b/server/internal/db/dbm/metasql/dm_meta.sql @@ -1,31 +1,31 @@ --DM_DB_SCHEMAS 库schemas select - distinct owner as schemaName + distinct owner as SCHEMA_NAME from dba_objects --------------------------------------- --DM_TABLE_INFO 表详细信息 select - a.object_name as tableName, - b.comments as tableComment, - a.created as createTime, - TABLE_USED_SPACE((SELECT SF_GET_SCHEMA_NAME_BY_ID(CURRENT_SCHID)), a.object_name)*page() as dataLength + a.object_name as TABLE_NAME, + b.comments as TABLE_COMMENT, + a.created as CREATE_TIME, + TABLE_USED_SPACE((SELECT SF_GET_SCHEMA_NAME_BY_ID(CURRENT_SCHID)), a.object_name)*page() as DATA_LENGTH from dba_objects a - JOIN USER_TAB_COMMENTS b ON b.TABLE_TYPE='TABLE' and a.object_name = b.TABLE_NAME + LEFT JOIN USER_TAB_COMMENTS b ON b.TABLE_TYPE='TABLE' and a.object_name = b.TABLE_NAME where a.owner = (SELECT SF_GET_SCHEMA_NAME_BY_ID(CURRENT_SCHID)) - and a.object_type = 'TABLE' + and a.object_type = 'TABLE' and a.status = 'VALID' --------------------------------------- --DM_INDEX_INFO 表索引信息 select - a.index_name as indexName, - a.index_type as indexType, - case when a.uniqueness = 'UNIQUE' then 1 else 0 end as nonUnique, - indexdef(b.object_id,1) as indexDef, - c.column_name as columnName, - c.column_position as seqInIndex, - '无' as indexComment + a.index_name as INDEX_NAME, + a.index_type as INDEX_TYPE, + case when a.uniqueness = 'UNIQUE' then 1 else 0 end as NON_UNIQUE, + indexdef(b.object_id,1) as INDEX_DEF, + c.column_name as COLUMN_NAME, + c.column_position as SEQ_IN_INDEX, + '无' as INDEX_COMMENT FROM DBA_INDEXES a - JOIN dba_objects b on a.owner = b.owner and b.object_name = a.index_name and b.object_type = 'INDEX' - JOIN DBA_IND_COLUMNS c on a.owner = c.table_owner and a.index_name = c.index_name and a.TABLE_NAME = c.table_name + LEFT JOIN dba_objects b on a.owner = b.owner and b.object_name = a.index_name and b.object_type = 'INDEX' + LEFT JOIN DBA_IND_COLUMNS c on a.owner = c.table_owner and a.index_name = c.index_name and a.TABLE_NAME = c.table_name WHERE a.owner = (SELECT SF_GET_SCHEMA_NAME_BY_ID(CURRENT_SCHID)) and a.TABLE_NAME = '%s' @@ -33,27 +33,34 @@ WHERE a.owner = (SELECT SF_GET_SCHEMA_NAME_BY_ID(CURRENT_SCHID)) order by a.TABLE_NAME, a.index_name, c.column_position asc --------------------------------------- --DM_COLUMN_MA 表列信息 -select a.table_name as tableName, - a.column_name as columnName, - case when a.NULLABLE = 'Y' then 'YES' when a.NULLABLE = 'N' then 'NO' else 'NO' end as nullable, +select a.table_name as TABLE_NAME, + a.column_name as COLUMN_NAME, + case when a.NULLABLE = 'Y' then 'YES' when a.NULLABLE = 'N' then 'NO' else 'NO' end as NULLABLE, case when a.char_col_decl_length > 0 then concat(a.data_type, '(', a.char_col_decl_length, ')') when a.data_precision > 0 and a.data_scale > 0 then concat(a.data_type, '(', a.data_precision, ',', a.data_scale, ')') else a.data_type end - as columnType, - b.comments as columnComment, - a.data_default as columnDefault, - a.data_scale as numScale, - case when t.COL_NAME = a.column_name then 'PRI' else '' end as columnKey + as COLUMN_TYPE, + b.comments as COLUMN_COMMENT, + a.data_default as COLUMN_DEFAULT, + a.data_scale as NUM_SCALE, + case when t.COL_NAME = a.column_name then 'PRI' else '' end as COLUMN_KEY from dba_tab_columns a - join user_col_comments b on b.owner = a.owner and b.table_name = a.table_name and a.column_name = b.column_name - join (select b.owner, b.table_name, a.name COL_NAME - from SYS.SYSCOLUMNS a, - dba_tables b, - sys.sysobjects c - where a.INFO2 & 0x01 = 0x01 - and a.id=c.id and c.name = b.table_name) t on t.owner = a.owner and t.table_name = a.table_name + left join user_col_comments b + on b.owner = (SELECT SF_GET_SCHEMA_NAME_BY_ID(CURRENT_SCHID)) and b.table_name = a.table_name and + a.column_name = b.column_name + left join (select b.owner, b.table_name, a.name COL_NAME + from SYS.SYSCOLUMNS a, + dba_tables b, + sys.sysobjects c, + sys.sysobjects d + where a.INFO2 & 0x01 = 0x01 + and a.id=c.id and d.type$ = 'SCH' and d.id = c.schid + and b.owner = (SELECT SF_GET_SCHEMA_NAME_BY_ID(CURRENT_SCHID)) + and c.schid = ( select id from sys.sysobjects where type$ = 'SCH' and name = (SELECT SF_GET_SCHEMA_NAME_BY_ID(CURRENT_SCHID))) + and c.name = b.table_name) t + on t.table_name = a.table_name where a.owner = (SELECT SF_GET_SCHEMA_NAME_BY_ID(CURRENT_SCHID)) and a.table_name in (%s) order by a.table_name, a.column_id \ No newline at end of file