diff --git a/mayfly_go_web/src/views/ops/db/component/table/DbTableOp.vue b/mayfly_go_web/src/views/ops/db/component/table/DbTableOp.vue index 617fc4ca..a85d1038 100644 --- a/mayfly_go_web/src/views/ops/db/component/table/DbTableOp.vue +++ b/mayfly_go_web/src/views/ops/db/component/table/DbTableOp.vue @@ -98,7 +98,7 @@ - + {{ typeValue }} @@ -134,7 +134,7 @@ import { reactive, ref, toRefs, watch } from 'vue'; import { ElMessage } from 'element-plus'; import SqlExecBox from '../sqleditor/SqlExecBox'; -import { getDbDialect, DbType } from '../../dialect/index'; +import { getDbDialect, DbType, RowDefinition, IndexDefinition } from '../../dialect/index'; const props = defineProps({ visible: { @@ -168,7 +168,7 @@ const state = reactive({ btnloading: false, activeName: '1', columnTypeList: dbDialect.getInfo().columnTypes, - indexTypeList: ['BTREE'], // mysql索引类型详解 http://c.biancheng.net/view/7897.html + indexTypeList: ['BTREE', 'NORMAL'], // mysql索引类型详解 http://c.biancheng.net/view/7897.html tableData: { fields: { colNames: [ @@ -214,17 +214,7 @@ const state = reactive({ label: '操作', }, ], - res: [] as { - name: string; - type: string; - value: string; - length: string; - numScale: string; - notNull: boolean; - pri: boolean; - auto_increment: boolean; - remark: string; - }[], + res: [] as RowDefinition[], }, indexs: { colNames: [ @@ -254,13 +244,7 @@ const state = reactive({ }, ], columns: [{ name: '', remark: '' }], - res: [] as { - indexName: string; - columnNames: string[]; - unique: boolean; - indexType: 'BTREE'; - indexComment: string; - }[], + res: [] as IndexDefinition[], }, tableName: '', tableComment: '', @@ -294,117 +278,11 @@ const addRow = () => { }; const addIndex = () => { - state.tableData.indexs.res.push({ - indexName: '', - columnNames: [], - unique: false, - indexType: 'BTREE', - indexComment: '', - }); + state.tableData.indexs.res.push(dbDialect.getDefaultIndex()); }; const addDefaultRows = () => { - if (props.dbType === DbType.mysql) { - state.tableData.fields.res.push( - { name: 'id', type: 'bigint', length: '20', numScale: '', value: '', notNull: true, pri: true, auto_increment: true, remark: '主键ID' }, - { name: 'creator_id', type: 'bigint', length: '20', numScale: '', value: '', notNull: true, pri: false, auto_increment: false, remark: '创建人id' }, - { - name: 'creator', - type: 'varchar', - length: '100', - numScale: '', - value: '', - notNull: true, - pri: false, - auto_increment: false, - remark: '创建人姓名', - }, - { - name: 'create_time', - type: 'datetime', - length: '', - numScale: '', - value: 'CURRENT_TIMESTAMP', - notNull: true, - pri: false, - auto_increment: false, - remark: '创建时间', - }, - { name: 'updator_id', type: 'bigint', length: '20', numScale: '', value: '', notNull: true, pri: false, auto_increment: false, remark: '修改人id' }, - { - name: 'updator', - type: 'varchar', - length: '100', - numScale: '', - value: '', - notNull: true, - pri: false, - auto_increment: false, - remark: '修改人姓名', - }, - { - name: 'update_time', - type: 'datetime', - length: '', - numScale: '', - value: 'CURRENT_TIMESTAMP', - notNull: true, - pri: false, - auto_increment: false, - remark: '修改时间', - } - ); - } else if (props.dbType === DbType.postgresql) { - state.tableData.fields.res.push( - { name: 'id', type: 'bigserial', length: '', numScale: '', value: '', notNull: true, pri: true, auto_increment: true, remark: '主键ID' }, - { name: 'creator_id', type: 'int8', length: '', numScale: '', value: '', notNull: true, pri: false, auto_increment: false, remark: '创建人id' }, - { - name: 'creator', - type: 'varchar', - length: '100', - numScale: '', - value: '', - notNull: true, - pri: false, - auto_increment: false, - remark: '创建人姓名', - }, - { - name: 'create_time', - type: 'timestamp', - length: '', - numScale: '', - value: 'CURRENT_TIMESTAMP', - notNull: true, - pri: false, - auto_increment: false, - remark: '创建时间', - }, - { name: 'updator_id', type: 'int8', length: '', numScale: '', value: '', notNull: true, pri: false, auto_increment: false, remark: '修改人id' }, - { - name: 'updator', - type: 'varchar', - length: '100', - numScale: '', - value: '', - notNull: true, - pri: false, - auto_increment: false, - remark: '修改人姓名', - }, - { - name: 'update_time', - type: 'timestamp', - length: '', - numScale: '', - value: 'CURRENT_TIMESTAMP', - notNull: true, - pri: false, - auto_increment: false, - remark: '修改时间', - } - ); - } + state.tableData.fields.res.push(...dbDialect.getDefaultRows()); }; const deleteRow = (index: any) => { @@ -562,7 +440,7 @@ const indexChanges = (row: any) => { row.indexComment = `${tableData.value.tableName}表(${name.replaceAll('_', ',')})${commentSuffix}`; }; -const oldData = { indexs: [] as any[], fields: [] as any[] }; +const oldData = { indexs: [] as any[], fields: [] as RowDefinition[] }; watch( () => props.data, (newValue: any) => { diff --git a/mayfly_go_web/src/views/ops/db/component/table/DbTablesOp.vue b/mayfly_go_web/src/views/ops/db/component/table/DbTablesOp.vue index 4cebdc7b..ab311376 100644 --- a/mayfly_go_web/src/views/ops/db/component/table/DbTablesOp.vue +++ b/mayfly_go_web/src/views/ops/db/component/table/DbTablesOp.vue @@ -181,7 +181,7 @@ const state = reactive({ visible: false, activeName: '1', type: '', - enableEditTypes: [DbType.mysql, DbType.postgresql], // 支持"编辑表"的数据库类型 + enableEditTypes: [DbType.mysql, DbType.postgresql, DbType.dm], // 支持"编辑表"的数据库类型 data: { // 修改表时,传递修改数据 edit: false, diff --git a/mayfly_go_web/src/views/ops/db/dialect/dm_dialect.ts b/mayfly_go_web/src/views/ops/db/dialect/dm_dialect.ts index c318f0b6..a14a944e 100644 --- a/mayfly_go_web/src/views/ops/db/dialect/dm_dialect.ts +++ b/mayfly_go_web/src/views/ops/db/dialect/dm_dialect.ts @@ -1,92 +1,52 @@ -import { DbDialect, sqlColumnType, DialectInfo } from './index'; +import { DbDialect, sqlColumnType, DialectInfo, RowDefinition, IndexDefinition } from './index'; -export { DMDialect, GAUSS_TYPE_LIST }; +export { DMDialect, DM_TYPE_LIST }; -const GAUSS_TYPE_LIST: sqlColumnType[] = [ - // 数值 - 整数型 - { udtName: 'int1', dataType: 'tinyint', desc: '微整数,别名为INT1', space: '1字节', range: '0 ~ +255' }, - { udtName: 'int2', dataType: 'smallint', desc: '小范围整数,别名为INT2。', space: '2字节', range: '-32,768 ~ +32,767' }, - { udtName: 'int4', dataType: 'integer', desc: '常用的整数,别名为INT4。', space: '4字节', range: '-2,147,483,648 ~ +2,147,483,647' }, - { udtName: 'int8', dataType: 'bigint', desc: '大范围的整数,别名为INT8。', space: '8字节', range: '很大' }, +// 参考文档:https://eco.dameng.com/document/dm/zh-cn/sql-dev/dmpl-sql-datatype.html#%E5%AD%97%E7%AC%A6%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B +const DM_TYPE_LIST: sqlColumnType[] = [ + // 字符数据类型 + { udtName: 'CHAR', dataType: 'VARCHAR', desc: '定长字符串', space: '', range: '1 - 32767' }, + { udtName: 'VARCHAR', dataType: 'VARCHAR', desc: '变长字符串', space: '', range: '1 - 32767' }, - // 数值 - 任意精度型 + // 精确数值数据类型 NUMERIC、DECIMAL、DEC 类型、NUMBER 类型、INTEGER 类型、INT 类型、BIGINT 类型、TINYINT 类型、BYTE 类型、SMALLINT + { udtName: 'NUMERIC', dataType: 'NUMERIC', desc: '零、正负定点数', space: '1-38', range: '' }, + { udtName: 'DECIMAL', dataType: 'DECIMAL', desc: '与NUMERIC相似', space: '1-38', range: '' }, + { udtName: 'NUMBER', dataType: 'NUMBER', desc: '同NUMERIC', space: '1-38', range: '' }, + { udtName: 'INTEGER', dataType: 'INTEGER', desc: '有符号整数', space: '10', range: '-2^31-1 ~ 2^31-1' }, + { udtName: 'INT', dataType: 'INT', desc: '同INTEGER', space: '10', range: '' }, + { udtName: 'BIGINT', dataType: 'BIGINT', desc: '有符号整数', space: '19', range: '-2^63-1 ~ 2^63-1' }, + { udtName: 'TINYINT', dataType: 'TINYINT', desc: '有符号整数', space: '3', range: '-128~+127' }, + { udtName: 'BYTE', dataType: 'BYTE', desc: '与 TINYINT 相似', space: '3', range: '' }, + { udtName: 'SMALLINT', dataType: 'SMALLINT', desc: '有符号整数', space: '5', range: '-2^15-1 ~ 2^15-1' }, + // (用得少,忽略)近似数值类型包括:FLOAT 类型、DOUBLE 类型、REAL 类型、DOUBLE PRECISION 类型。 + // 位串数据类型 BIT 用于存储整数数据 1、0 或 NULL,只有 0 才转换为假,其他非空、非 0 值都会自动转换为真 + { udtName: 'BIT', dataType: 'BIT', desc: '用于存储整数数据 1、0 或 NULL', space: '1', range: '1' }, + // 一般日期时间数据类型 DATE TIME TIMESTAMP 默认精度 6 + // 多媒体数据类型 TEXT/LONG/LONGVARCHAR 类型:变长字符串类型 IMAGE/LONGVARBINARY 类型 BLOB CLOB BFILE 100G-1 + { udtName: 'DATE', dataType: 'DATE', desc: '年、月、日', space: '', range: '' }, + { udtName: 'TIME', dataType: 'TIME', desc: '时、分、秒', space: '', range: '' }, { - udtName: 'numeric', - dataType: 'numeric', - desc: '精度(总位数)取值范围为[1,1000],标度(小数位数)取值范围为[0,精度]。', - space: '每四位(十进制位)占用两个字节,然后在整个数据上加上八个字节的额外开销', - range: '未指定精度的情况下,小数点前最大131,072位,小数点后最大16,383位', + udtName: 'TIMESTAMP', + dataType: 'TIMESTAMP', + desc: '年、月、日、时、分、秒', + space: '', + range: '-4712-01-01 00:00:00.000000000 ~ 9999-12-31 23:59:59.999999999', }, - // 数值 - 任意精度型 - { udtName: 'decimal', dataType: 'decimal', desc: '等同于number类型', space: '等同于number类型' }, - - // 数值 - 序列整型 - { udtName: 'smallserial', dataType: 'smallserial', desc: '二字节序列整型。', space: '2字节', range: '-32,768 ~ +32,767' }, - { udtName: 'serial', dataType: 'serial', desc: '四字节序列整型。', space: '4字节', range: '-2,147,483,648 ~ +2,147,483,647' }, - { udtName: 'bigserial', dataType: 'bigserial', desc: '八字节序列整型', space: '8字节', range: '-9,223,372,036,854,775,808 ~ +9,223,372,036,854,775,807' }, - { - udtName: 'largeserial', - dataType: 'largeserial', - desc: '默认插入十六字节序列整型,实际数值类型和numeric相同', - space: '变长类型,每四位(十进制位)占用两个字节,然后在整个数据上加上八个字节的额外开销。', - range: '小数点前最大131,072位,小数点后最大16,383位。', - }, - - // 数值 - 浮点类型(不常用 就不列出来了) - - // 货币类型 - { udtName: 'money', dataType: 'money', desc: '货币金额', space: '8字节', range: '-92233720368547758.08 ~ +92233720368547758.07' }, - - // 布尔类型 - { udtName: 'bool', dataType: 'bool', desc: '布尔类型', space: '1字节', range: 'true:真 , false:假 , null:未知(unknown)' }, - - // 字符类型 - { udtName: 'char', dataType: 'char', desc: '定长字符串,不足补空格。n是指字节长度,如不带精度n,默认精度为1。', space: '最大为10MB' }, - { udtName: 'character', dataType: 'character', desc: '定长字符串,不足补空格。n是指字节长度,如不带精度n,默认精度为1。', space: '最大为10MB' }, - { udtName: 'nchar', dataType: 'nchar', desc: '定长字符串,不足补空格。n是指字节长度,如不带精度n,默认精度为1。', space: '最大为10MB' }, - { udtName: 'varchar', dataType: 'varchar', desc: '变长字符串。PG兼容模式下,n是字符长度。其他兼容模式下,n是指字节长度。', space: '最大为10MB。' }, - { udtName: 'text', dataType: 'text', desc: '变长字符串。', space: '最大稍微小于1GB-1。' }, - { udtName: 'clob', dataType: 'clob', desc: '文本大对象。是TEXT类型的别名。', space: '最大稍微小于32TB-1。' }, - - //特殊字符类型 用的很少,先屏蔽了 - // { udtName: 'name', dataType: 'name', desc: '用于对象名的内部类型。', space: '64字节。' }, - // { udtName: '"char"', dataType: '"char"', desc: '单字节内部类型。', space: '1字节。' }, - - // 二进制类型 - { udtName: 'bytea', dataType: 'bytea', desc: '变长的二进制字符串', space: '4字节加上实际的二进制字符串。最大为1GB减去8203字节(即1073733621字节)。' }, - - // 日期/时间类型 - { udtName: 'date', dataType: 'date', desc: '日期', space: '4字节' }, - { udtName: 'time', dataType: 'time', desc: 'TIME [(p)] 只用于一日内时间,p表示小数点后的精度,取值范围为0~6。', space: '8-12字节' }, - { udtName: 'timestamp', dataType: 'timestamp', desc: 'TIMESTAMP[(p)]日期和时间,p表示小数点后的精度,取值范围为0~6', space: '8字节' }, - // 带时区的时间戳用的少,先屏蔽了 - //{ udtName: 'TIMESTAMPTZ', dataType: 'TIMESTAMP WITH TIME ZONE', desc: '带时区的时间戳', space: '8字节' }, - { - udtName: 'interval', - dataType: 'interval', - desc: '时间间隔', // 可以跟参数:YEAR,MONTH,DAY,HOUR,MINUTE,SECOND,DAY TO HOUR,DAY TO MINUTE,DAY TO SECOND,HOUR TO MINUTE,HOUR TO SECOND,MINUTE TO SECOND - space: '精度取值范围为0~6,且参数为SECOND,DAY TO SECOND,HOUR TO SECOND或MINUTE TO SECOND时,参数p才有效', - }, - // 几何类型 - { udtName: 'point', dataType: 'point', desc: '平面中的点, 如:(x,y)', space: '16字节' }, - { udtName: 'lseg', dataType: 'lseg', desc: '(有限)线段, 如:((x1,y1),(x2,y2))', space: '32字节' }, - { udtName: 'box', dataType: 'box', desc: '矩形, 如:((x1,y1),(x2,y2))', space: '32字节' }, - { udtName: 'path', dataType: 'path', desc: '闭合路径(与多边形类似), 如:((x1,y1),...)', space: '16+16n字节' }, - { udtName: 'path', dataType: 'path', desc: '开放路径(与多边形类似), 如:[(x1,y1),...]', space: '16+16n字节' }, - { udtName: 'polygon', dataType: 'polygon', desc: '多边形(与闭合路径相似), 如:((x1,y1),...)', space: '40+16n字节' }, - { udtName: 'circle', dataType: 'polygon', desc: '圆,如:<(x,y),r> (圆心和半径)', space: '24 字节' }, - - // 网络地址类型 - { udtName: 'cidr', dataType: 'cidr', desc: 'IPv4网络', space: '7字节' }, - { udtName: 'inet', dataType: 'inet', desc: 'IPv4主机和网络', space: '7字节' }, - { udtName: 'macaddr', dataType: 'macaddr', desc: 'MAC地址', space: '6字节' }, + { udtName: 'TEXT', dataType: 'TEXT', desc: '变长字符串', space: '', range: '100G-1' }, + { udtName: 'LONG', dataType: 'LONG', desc: '同TEXT', space: '', range: '100G-1' }, + { udtName: 'LONGVARCHAR', dataType: 'LONGVARCHAR', desc: '同TEXT', space: '', range: '100G-1' }, + { udtName: 'IMAGE', dataType: 'IMAGE', desc: '图像二进制类型', space: '', range: '100G-1' }, + { udtName: 'LONGVARBINARY', dataType: 'LONGVARBINARY', desc: '同IMAGE', space: '', range: '100G-1' }, + { udtName: 'BLOB', dataType: 'BLOB', desc: '变长的二进制大对象', space: '', range: '100G-1' }, + { udtName: 'CLOB', dataType: 'CLOB', desc: '同TEXT', space: '', range: '100G-1' }, + { udtName: 'BFILE', dataType: 'BFILE', desc: '二进制文件', space: '', range: '100G-1' }, ]; const dmDialectInfo: DialectInfo = { icon: 'iconfont icon-db-dm', defaultPort: 5236, formatSqlDialect: 'postgresql', - columnTypes: GAUSS_TYPE_LIST.sort((a, b) => a.udtName.localeCompare(b.udtName)), + columnTypes: DM_TYPE_LIST.sort((a, b) => a.udtName.localeCompare(b.udtName)), }; class DMDialect implements DbDialect { @@ -100,6 +60,67 @@ class DMDialect implements DbDialect { } LIMIT ${limit};`; } + getDefaultRows(): RowDefinition[] { + return [ + { name: 'id', type: 'BIGINT', length: '', numScale: '', value: '', notNull: true, pri: true, auto_increment: true, remark: '主键ID' }, + { name: 'creator_id', type: 'BIGINT', length: '', numScale: '', value: '', notNull: true, pri: false, auto_increment: false, remark: '创建人id' }, + { + name: 'creator', + type: 'VARCHAR', + length: '100', + numScale: '', + value: '', + notNull: true, + pri: false, + auto_increment: false, + remark: '创建人姓名', + }, + { + name: 'create_time', + type: 'TIMESTAMP', + length: '', + numScale: '', + value: 'SYSDATE', + notNull: true, + pri: false, + auto_increment: false, + remark: '创建时间', + }, + { name: 'updator_id', type: 'BIGINT', length: '', numScale: '', value: '', notNull: true, pri: false, auto_increment: false, remark: '修改人id' }, + { + name: 'updator', + type: 'VARCHAR', + length: '100', + numScale: '', + value: '', + notNull: true, + pri: false, + auto_increment: false, + remark: '修改人姓名', + }, + { + name: 'update_time', + type: 'TIMESTAMP', + length: '', + numScale: '', + value: 'SYSDATE', + notNull: true, + pri: false, + auto_increment: false, + remark: '修改时间', + }, + ]; + } + + getDefaultIndex(): IndexDefinition { + return { + indexName: '', + columnNames: [], + unique: false, + indexType: 'NORMAL', + indexComment: '', + }; + } wrapName = (name: string) => { return name; }; @@ -120,9 +141,10 @@ class DMDialect implements DbDialect { if (cl.value && cl.value.length > 0) { // 哪些字段默认值需要加引号 let marks = false; - if (this.matchType(cl.type, ['char', 'time', 'date', 'text'])) { + if (this.matchType(cl.type, ['CHAR', 'TIME', 'DATE', 'TEXT'])) { // 默认值是now()的time或date不需要加引号 - if (cl.value.toLowerCase().replace(' ', '') === 'CURRENT_TIMESTAMP' && this.matchType(cl.type, ['time', 'date'])) { + let val = cl.value.toUpperCase().replace(' ', ''); + if (this.matchType(cl.type, ['TIME', 'DATE']) && ['CURRENT_DATE', 'SYSDATE', 'CURDATE', 'CURTIME'].includes(val)) { marks = false; } else { marks = true; @@ -138,10 +160,10 @@ class DMDialect implements DbDialect { } getTypeLengthSql(cl: any) { - // 哪些字段可以指定长度 - if (cl.length && this.matchType(cl.type, ['char', 'time', 'bit', 'num', 'decimal'])) { + // 哪些字段可以指定长度 VARCHAR/VARCHAR2/CHAR/BIT/NUMBER/NUMERIC/TIME、TIMESTAMP(可以指定小数秒精度) + if (cl.length && this.matchType(cl.type, ['CHAR', 'BIT', 'TIME', 'NUM', 'DEC'])) { // 哪些字段类型可以指定小数点 - if (cl.numScale && this.matchType(cl.type, ['num', 'decimal'])) { + if (cl.numScale && this.matchType(cl.type, ['NUM', 'DEC'])) { return `(${cl.length}, ${cl.numScale})`; } else { return `(${cl.length})`; @@ -150,11 +172,12 @@ class DMDialect implements DbDialect { return ''; } - genColumnBasicSql(cl: any): string { + genColumnBasicSql(cl: RowDefinition): string { let length = this.getTypeLengthSql(cl); // 默认值 let defVal = this.getDefaultValueSql(cl); - return ` ${cl.name} ${cl.type}${length} ${cl.notNull ? 'NOT NULL' : ''} ${defVal} `; + let incr = cl.auto_increment ? 'IDENTITY' : ''; + return ` ${cl.name} ${cl.type}${length} ${incr} ${cl.notNull ? 'NOT NULL' : ''} ${defVal} `; } getCreateTableSql(data: any): string { @@ -196,30 +219,26 @@ class DMDialect implements DbDialect { let sql: string[] = []; tableData.indexs.res.forEach((a: any) => { sql.push(` CREATE ${a.unique ? 'UNIQUE' : ''} INDEX ${a.indexName} USING btree ("${a.columnNames.join('","')})"`); - if (a.indexComment) { - sql.push(`COMMENT ON INDEX ${a.indexName} IS '${a.indexComment}'`); - } }); return sql.join(';'); } - getModifyColumnSql(tableName: string, changeData: { del: any[]; add: any[]; upd: any[] }): string { + getModifyColumnSql(tableName: string, changeData: { del: RowDefinition[]; add: RowDefinition[]; upd: RowDefinition[] }): string { let sql: string[] = []; if (changeData.add.length > 0) { changeData.add.forEach((a) => { - let typeLength = this.getTypeLengthSql(a); - let defaultSql = this.getDefaultValueSql(a); - sql.push(`ALTER TABLE ${tableName} add ${a.name} ${a.type}${typeLength} ${defaultSql}`); + sql.push(`ALTER TABLE ${tableName} add COLUMN ${this.genColumnBasicSql(a)}`); + if (a.remark) { + sql.push(`comment on COLUMN "${tableName}"."${a.name}" is '${a.remark}'`); + } }); } if (changeData.upd.length > 0) { changeData.upd.forEach((a) => { - let typeLength = this.getTypeLengthSql(a); - sql.push(`ALTER TABLE ${tableName} alter column ${a.name} type ${a.type}${typeLength}`); - let defaultSql = this.getDefaultValueSql(a); - if (defaultSql) { - sql.push(`alter table ${tableName} alter column ${a.name} set ${defaultSql}`); + sql.push(`ALTER TABLE ${tableName} MODIFY ${this.genColumnBasicSql(a)}`); + if (a.remark) { + sql.push(`comment on COLUMN "${tableName}"."${a.name}" is '${a.remark}'`); } }); } diff --git a/mayfly_go_web/src/views/ops/db/dialect/index.ts b/mayfly_go_web/src/views/ops/db/dialect/index.ts index d6d9b063..c66d948f 100644 --- a/mayfly_go_web/src/views/ops/db/dialect/index.ts +++ b/mayfly_go_web/src/views/ops/db/dialect/index.ts @@ -11,6 +11,26 @@ export interface sqlColumnType { range?: string; } +export interface RowDefinition { + name: string; + type: string; + value: string; + length: string; + numScale: string; + notNull: boolean; + pri: boolean; + auto_increment: boolean; + remark: string; +} + +export interface IndexDefinition { + indexName: string; + columnNames: string[]; + unique: boolean; + indexType: string; + indexComment?: string; +} + // 数据库基础信息 export interface DialectInfo { /** @@ -56,6 +76,10 @@ export interface DbDialect { */ getDefaultSelectSql(table: string, condition: string, orderBy: string, pageNum: number, limit: number): string; + getDefaultRows(): RowDefinition[]; + + getDefaultIndex(): IndexDefinition; + /** * 包裹数据库表名、字段名等,避免使用关键字为字段名或表名时报错 * @param name 名称 @@ -79,7 +103,7 @@ export interface DbDialect { * @param tableName 表名 * @param changeData 改变信息 */ - getModifyColumnSql(tableName: string, changeData: { del: any[]; add: any[]; upd: any[] }): string; + getModifyColumnSql(tableName: string, changeData: { del: RowDefinition[]; add: RowDefinition[]; upd: RowDefinition[] }): string; /** * 生成编辑索引sql diff --git a/mayfly_go_web/src/views/ops/db/dialect/mysql_dialect.ts b/mayfly_go_web/src/views/ops/db/dialect/mysql_dialect.ts index 05cbe795..279a2473 100644 --- a/mayfly_go_web/src/views/ops/db/dialect/mysql_dialect.ts +++ b/mayfly_go_web/src/views/ops/db/dialect/mysql_dialect.ts @@ -1,4 +1,4 @@ -import { DbDialect, DialectInfo } from './index'; +import { DbDialect, DialectInfo, IndexDefinition, RowDefinition } from './index'; export { MYSQL_TYPE_LIST, MysqlDialect, language }; @@ -47,6 +47,68 @@ class MysqlDialect implements DbDialect { }, ${limit};`; } + getDefaultRows(): RowDefinition[] { + return [ + { name: 'id', type: 'bigint', length: '20', numScale: '', value: '', notNull: true, pri: true, auto_increment: true, remark: '主键ID' }, + { name: 'creator_id', type: 'bigint', length: '20', numScale: '', value: '', notNull: true, pri: false, auto_increment: false, remark: '创建人id' }, + { + name: 'creator', + type: 'varchar', + length: '100', + numScale: '', + value: '', + notNull: true, + pri: false, + auto_increment: false, + remark: '创建人姓名', + }, + { + name: 'create_time', + type: 'datetime', + length: '', + numScale: '', + value: 'CURRENT_TIMESTAMP', + notNull: true, + pri: false, + auto_increment: false, + remark: '创建时间', + }, + { name: 'updator_id', type: 'bigint', length: '20', numScale: '', value: '', notNull: true, pri: false, auto_increment: false, remark: '修改人id' }, + { + name: 'updator', + type: 'varchar', + length: '100', + numScale: '', + value: '', + notNull: true, + pri: false, + auto_increment: false, + remark: '修改人姓名', + }, + { + name: 'update_time', + type: 'datetime', + length: '', + numScale: '', + value: 'CURRENT_TIMESTAMP', + notNull: true, + pri: false, + auto_increment: false, + remark: '修改时间', + }, + ]; + } + + getDefaultIndex(): IndexDefinition { + return { + indexName: '', + columnNames: [], + unique: false, + indexType: 'BTREE', + indexComment: '', + }; + } + wrapName = (name: string) => { return `\`${name}\``; }; @@ -86,7 +148,7 @@ class MysqlDialect implements DbDialect { return sql.substring(0, sql.length - 1) + ';'; } - getModifyColumnSql(tableName: string, changeData: { del: any[]; add: any[]; upd: any[] }): string { + getModifyColumnSql(tableName: string, changeData: { del: RowDefinition[]; add: RowDefinition[]; upd: RowDefinition[] }): string { let addSql = '', updSql = '', delSql = ''; diff --git a/mayfly_go_web/src/views/ops/db/dialect/postgres_dialect.ts b/mayfly_go_web/src/views/ops/db/dialect/postgres_dialect.ts index 6ee1ad88..93301bee 100644 --- a/mayfly_go_web/src/views/ops/db/dialect/postgres_dialect.ts +++ b/mayfly_go_web/src/views/ops/db/dialect/postgres_dialect.ts @@ -1,4 +1,4 @@ -import { DbDialect, DialectInfo, sqlColumnType } from './index'; +import { DbDialect, DialectInfo, IndexDefinition, RowDefinition, sqlColumnType } from './index'; export { PostgresqlDialect, GAUSS_TYPE_LIST }; @@ -100,6 +100,68 @@ class PostgresqlDialect implements DbDialect { } LIMIT ${limit};`; } + getDefaultRows(): RowDefinition[] { + return [ + { name: 'id', type: 'bigserial', length: '', numScale: '', value: '', notNull: true, pri: true, auto_increment: true, remark: '主键ID' }, + { name: 'creator_id', type: 'int8', length: '', numScale: '', value: '', notNull: true, pri: false, auto_increment: false, remark: '创建人id' }, + { + name: 'creator', + type: 'varchar', + length: '100', + numScale: '', + value: '', + notNull: true, + pri: false, + auto_increment: false, + remark: '创建人姓名', + }, + { + name: 'create_time', + type: 'timestamp', + length: '', + numScale: '', + value: 'CURRENT_TIMESTAMP', + notNull: true, + pri: false, + auto_increment: false, + remark: '创建时间', + }, + { name: 'updator_id', type: 'int8', length: '', numScale: '', value: '', notNull: true, pri: false, auto_increment: false, remark: '修改人id' }, + { + name: 'updator', + type: 'varchar', + length: '100', + numScale: '', + value: '', + notNull: true, + pri: false, + auto_increment: false, + remark: '修改人姓名', + }, + { + name: 'update_time', + type: 'timestamp', + length: '', + numScale: '', + value: 'CURRENT_TIMESTAMP', + notNull: true, + pri: false, + auto_increment: false, + remark: '修改时间', + }, + ]; + } + + getDefaultIndex(): IndexDefinition { + return { + indexName: '', + columnNames: [], + unique: false, + indexType: 'BTREE', + indexComment: '', + }; + } + wrapName = (name: string) => { return name; }; @@ -122,7 +184,7 @@ class PostgresqlDialect implements DbDialect { let marks = false; if (this.matchType(cl.type, ['char', 'time', 'date', 'text'])) { // 默认值是now()的time或date不需要加引号 - if (cl.value.toLowerCase().replace(' ', '') === 'CURRENT_TIMESTAMP' && this.matchType(cl.type, ['time', 'date'])) { + if (cl.value.toLowerCase().replace(' ', '') === 'current_timestamp' && this.matchType(cl.type, ['time', 'date'])) { marks = false; } else { marks = true; @@ -203,13 +265,16 @@ class PostgresqlDialect implements DbDialect { return sql.join(';'); } - getModifyColumnSql(tableName: string, changeData: { del: any[]; add: any[]; upd: any[] }): string { + getModifyColumnSql(tableName: string, changeData: { del: RowDefinition[]; add: RowDefinition[]; upd: RowDefinition[] }): string { let sql: string[] = []; if (changeData.add.length > 0) { changeData.add.forEach((a) => { let typeLength = this.getTypeLengthSql(a); let defaultSql = this.getDefaultValueSql(a); sql.push(`ALTER TABLE ${tableName} add ${a.name} ${a.type}${typeLength} ${defaultSql}`); + if (a.remark) { + sql.push(`comment on column "${tableName}"."${a.name}" is '${a.remark}'`); + } }); } @@ -221,6 +286,9 @@ class PostgresqlDialect implements DbDialect { if (defaultSql) { sql.push(`alter table ${tableName} alter column ${a.name} set ${defaultSql}`); } + if (a.remark) { + sql.push(`comment on column "${tableName}"."${a.name}" is '${a.remark}'`); + } }); } diff --git a/server/internal/db/dbm/metasql/dm_meta.sql b/server/internal/db/dbm/metasql/dm_meta.sql index c7576d1e..7549277b 100644 --- a/server/internal/db/dbm/metasql/dm_meta.sql +++ b/server/internal/db/dbm/metasql/dm_meta.sql @@ -27,7 +27,9 @@ 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 -WHERE a.owner = (SELECT SF_GET_SCHEMA_NAME_BY_ID(CURRENT_SCHID)) and a.TABLE_NAME = '%s' +WHERE a.owner = (SELECT SF_GET_SCHEMA_NAME_BY_ID(CURRENT_SCHID)) + and a.TABLE_NAME = '%s' + and indexdef(b.object_id,1) != '禁止查看系统定义的索引信息' order by a.TABLE_NAME, a.index_name, c.column_position asc --------------------------------------- --DM_COLUMN_MA 表列信息