mirror of
https://gitee.com/dromara/mayfly-go
synced 2025-11-02 15:30:25 +08:00
!107 feat:支持修改表名、注释,oracle bug修复
* fix:修复oracle查询数据参数超过1000错误 ORA-01795 * feat:支持右键重命名表 * feat:支持修改表名、表注释
This commit is contained in:
@@ -168,7 +168,7 @@
|
||||
|
||||
<script lang="ts" setup>
|
||||
import { defineAsyncComponent, h, onBeforeUnmount, onMounted, reactive, ref, toRefs } from 'vue';
|
||||
import { ElCheckbox, ElMessage, ElMessageBox } from 'element-plus';
|
||||
import { ElCheckbox, ElInput, ElMessage, ElMessageBox } from 'element-plus';
|
||||
import { formatByteSize } from '@/common/utils/format';
|
||||
import { DbInst, registerDbCompletionItemProvider, TabInfo, TabType } from './db';
|
||||
import { NodeType, TagTreeNode } from '../component/tag';
|
||||
@@ -182,6 +182,7 @@ import { sleep } from '@/common/utils/loading';
|
||||
import { TagResourceTypeEnum } from '@/common/commonEnum';
|
||||
import { Pane, Splitpanes } from 'splitpanes';
|
||||
import { useEventListener } from '@vueuse/core';
|
||||
import SqlExecBox from '@/views/ops/db/component/sqleditor/SqlExecBox';
|
||||
|
||||
const DbTableOp = defineAsyncComponent(() => import('./component/table/DbTableOp.vue'));
|
||||
const DbSqlEditor = defineAsyncComponent(() => import('./component/sqleditor/DbSqlEditor.vue'));
|
||||
@@ -389,6 +390,7 @@ const NodeTypeSqlMenu = new NodeType(SqlExecNodeType.SqlMenu)
|
||||
const NodeTypeTable = new NodeType(SqlExecNodeType.Table)
|
||||
.withContextMenuItems([
|
||||
new ContextmenuItem('copyTable', '复制表').withIcon('copyDocument').withOnClick((data: any) => onCopyTable(data)),
|
||||
new ContextmenuItem('renameTable', '重命名').withIcon('edit').withOnClick((data: any) => onRenameTable(data)),
|
||||
new ContextmenuItem('editTable', '编辑表').withIcon('edit').withOnClick((data: any) => onEditTable(data)),
|
||||
new ContextmenuItem('delTable', '删除表').withIcon('Delete').withOnClick((data: any) => onDeleteTable(data)),
|
||||
])
|
||||
@@ -699,6 +701,48 @@ const onDeleteTable = async (data: any) => {
|
||||
});
|
||||
};
|
||||
|
||||
const onRenameTable = async (data: any) => {
|
||||
let { db, id, tableName, parentKey, flowProcdefKey } = data.params;
|
||||
let tableData = { db, oldTableName: tableName, tableName };
|
||||
|
||||
let value = ref(tableName);
|
||||
// 弹出确认框,并选择是否复制数据
|
||||
await ElMessageBox({
|
||||
title: `重命名表【${db}.${tableName}】`,
|
||||
type: 'warning',
|
||||
message: () =>
|
||||
h(ElInput, {
|
||||
modelValue: value.value,
|
||||
'onUpdate:modelValue': (val: string) => {
|
||||
value.value = val;
|
||||
},
|
||||
}),
|
||||
callback: (action: string) => {
|
||||
if (action === 'confirm') {
|
||||
tableData.tableName = value.value;
|
||||
let sql = nowDbInst.value.getDialect().getModifyTableInfoSql(tableData);
|
||||
if (sql) {
|
||||
SqlExecBox({
|
||||
sql: sql,
|
||||
dbId: id as any,
|
||||
db: db as any,
|
||||
dbType: nowDbInst.value.getDialect().getInfo().formatSqlDialect,
|
||||
flowProcdefKey: flowProcdefKey,
|
||||
runSuccessCallback: () => {
|
||||
setTimeout(() => {
|
||||
parentKey && reloadNode(parentKey);
|
||||
}, 1000);
|
||||
},
|
||||
});
|
||||
} else {
|
||||
ElMessage.error('无更改');
|
||||
return;
|
||||
}
|
||||
}
|
||||
},
|
||||
});
|
||||
};
|
||||
|
||||
const onCopyTable = async (data: any) => {
|
||||
let { db, id, tableName, parentKey } = data.params;
|
||||
|
||||
|
||||
@@ -262,6 +262,8 @@ const state = reactive({
|
||||
},
|
||||
tableName: '',
|
||||
tableComment: '',
|
||||
oldTableName: '',
|
||||
oldTableComment: '',
|
||||
height: 450,
|
||||
db: '',
|
||||
},
|
||||
@@ -410,6 +412,7 @@ const filterChangedData = (oldArr: object[], nowArr: object[], key: string): { d
|
||||
|
||||
const genSql = () => {
|
||||
let data = state.tableData;
|
||||
console.log(data);
|
||||
// 创建表
|
||||
if (!props.data?.edit) {
|
||||
let createTable = dbDialect.getCreateTableSql(data);
|
||||
@@ -424,12 +427,14 @@ const genSql = () => {
|
||||
let colSql = changeColData.changed ? dbDialect.getModifyColumnSql(data, data.tableName, changeColData) : '';
|
||||
// 修改索引
|
||||
let changeIdxData = filterChangedData(state.tableData.indexs.oldIndexs, state.tableData.indexs.res, 'indexName');
|
||||
let idxSql = changeColData.changed ? dbDialect.getModifyIndexSql(data, data.tableName, changeIdxData) : '';
|
||||
// 修改表名
|
||||
let idxSql = changeIdxData.changed ? dbDialect.getModifyIndexSql(data, data.tableName, changeIdxData) : '';
|
||||
// 修改表名,表注释
|
||||
let tableInfoSql = data.tableName !== data.oldTableName || data.tableComment !== data.oldTableComment ? dbDialect.getModifyTableInfoSql(data) : '';
|
||||
|
||||
let sqlArr = [];
|
||||
colSql && sqlArr.push(colSql);
|
||||
idxSql && sqlArr.push(idxSql);
|
||||
tableInfoSql && sqlArr.push(tableInfoSql);
|
||||
|
||||
return sqlArr.join(';');
|
||||
}
|
||||
@@ -486,13 +491,18 @@ watch(
|
||||
// 回显表名表注释
|
||||
state.tableData.tableName = row.tableName;
|
||||
state.tableData.tableComment = row.tableComment;
|
||||
state.tableData.oldTableName = row.tableName;
|
||||
state.tableData.oldTableComment = row.tableComment;
|
||||
state.tableData.db = props.db!;
|
||||
|
||||
state.tableData.fields.oldFields = [];
|
||||
state.tableData.fields.res = [];
|
||||
state.tableData.indexs.oldIndexs = [];
|
||||
state.tableData.indexs.res = [];
|
||||
// 索引列下拉选
|
||||
state.tableData.indexs.columns = [];
|
||||
// 回显列
|
||||
if (columns && Array.isArray(columns) && columns.length > 0) {
|
||||
state.tableData.fields.oldFields = [];
|
||||
state.tableData.fields.res = [];
|
||||
// 索引列下拉选
|
||||
state.tableData.indexs.columns = [];
|
||||
columns.forEach((a) => {
|
||||
let typeObj = a.columnType.replace(')', '').split('(');
|
||||
let type = typeObj[0];
|
||||
@@ -521,10 +531,9 @@ watch(
|
||||
state.tableData.indexs.columns.push({ name: a.columnName, remark: a.columnComment });
|
||||
});
|
||||
}
|
||||
|
||||
// 回显索引
|
||||
if (indexs && Array.isArray(indexs) && indexs.length > 0) {
|
||||
state.tableData.indexs.oldIndexs = [];
|
||||
state.tableData.indexs.res = [];
|
||||
// 索引过滤掉主键
|
||||
indexs
|
||||
.filter((a) => a.indexName !== 'PRIMARY')
|
||||
|
||||
@@ -663,6 +663,22 @@ class DMDialect implements DbDialect {
|
||||
}
|
||||
return '';
|
||||
}
|
||||
getModifyTableInfoSql(tableData: any): string {
|
||||
let schemaArr = tableData.db.split('/');
|
||||
let schema = schemaArr.length > 1 ? schemaArr[schemaArr.length - 1] : schemaArr[0];
|
||||
|
||||
let sql = '';
|
||||
|
||||
if (tableData.oldTableName !== tableData.tableName) {
|
||||
let baseTable = `${this.quoteIdentifier(schema)}.${this.quoteIdentifier(tableData.oldTableName)}`;
|
||||
sql += `ALTER TABLE ${baseTable} RENAME TO ${this.quoteIdentifier(tableData.tableName)};`;
|
||||
}
|
||||
if (tableData.oldTableComment !== tableData.tableComment) {
|
||||
let baseTable = `${this.quoteIdentifier(schema)}.${this.quoteIdentifier(tableData.tableName)}`;
|
||||
sql += `COMMENT ON TABLE ${baseTable} IS '${tableData.tableComment}';`;
|
||||
}
|
||||
return sql;
|
||||
}
|
||||
|
||||
getDataType(columnType: string): DataType {
|
||||
if (DbInst.isNumber(columnType)) {
|
||||
|
||||
@@ -222,6 +222,9 @@ export interface DbDialect {
|
||||
*/
|
||||
getModifyIndexSql(tableData: any, tableName: string, changeData: { del: any[]; add: any[]; upd: any[] }): string;
|
||||
|
||||
/** 生成编辑表信息sql */
|
||||
getModifyTableInfoSql(tableData: any): string;
|
||||
|
||||
/** 通过数据库字段类型,返回基本数据类型 */
|
||||
getDataType(columnType: string): DataType;
|
||||
|
||||
|
||||
@@ -399,6 +399,37 @@ ELSE
|
||||
return arr.join(';');
|
||||
}
|
||||
|
||||
getModifyTableInfoSql(tableData: any): string {
|
||||
let schemaArr = tableData.db.split('/');
|
||||
let schema = schemaArr.length > 1 ? schemaArr[schemaArr.length - 1] : schemaArr[0];
|
||||
|
||||
let sql = '';
|
||||
|
||||
if (tableData.oldTableName !== tableData.tableName) {
|
||||
let baseTable = `${this.quoteIdentifier(schema)}.${this.quoteIdentifier(tableData.oldTableName)}`;
|
||||
// 查找是否存在注释,存在则修改,不存在则添加
|
||||
sql += `EXEC sp_rename '${baseTable}', '${tableData.tableName}';`;
|
||||
}
|
||||
|
||||
if (tableData.oldTableComment !== tableData.tableComment) {
|
||||
// 转义注释中的单引号和换行符
|
||||
let tableComment = tableData.tableComment.replaceAll(/'/g, '').replaceAll(/[\r\n]/g, ' ');
|
||||
sql += `IF ((SELECT COUNT(*) FROM fn_listextendedproperty('MS_Description',
|
||||
'SCHEMA', N'${schema}',
|
||||
'TABLE', N'${tableData.tableName}', NULL, NULL)) > 0)
|
||||
EXEC sp_updateextendedproperty
|
||||
'MS_Description', N'${tableComment}',
|
||||
'SCHEMA', N'${schema}',
|
||||
'TABLE', N'${tableData.tableName}'
|
||||
ELSE
|
||||
EXEC sp_addextendedproperty
|
||||
'MS_Description', N'${tableComment}',
|
||||
'SCHEMA', N'${schema}',
|
||||
'TABLE', N'${tableData.tableName}'`;
|
||||
}
|
||||
return sql;
|
||||
}
|
||||
|
||||
getDataType(columnType: string): DataType {
|
||||
if (DbInst.isNumber(columnType)) {
|
||||
return DataType.Number;
|
||||
|
||||
@@ -323,6 +323,18 @@ class MysqlDialect implements DbDialect {
|
||||
return '';
|
||||
}
|
||||
|
||||
getModifyTableInfoSql(tableData: any): string {
|
||||
let sql = '';
|
||||
if (tableData.tableComment !== tableData.oldTableComment) {
|
||||
sql += `ALTER TABLE ${this.quoteIdentifier(tableData.db)}.${this.quoteIdentifier(tableData.oldTableName)} COMMENT '${tableData.tableComment}';`;
|
||||
}
|
||||
|
||||
if (tableData.tableName !== tableData.oldTableName) {
|
||||
sql += `ALTER TABLE ${this.quoteIdentifier(tableData.db)}.${this.quoteIdentifier(tableData.oldTableName)} RENAME TO ${this.quoteIdentifier(tableData.tableName)};`;
|
||||
}
|
||||
return sql;
|
||||
}
|
||||
|
||||
getDataType(columnType: string): DataType {
|
||||
if (DbInst.isNumber(columnType)) {
|
||||
return DataType.Number;
|
||||
|
||||
@@ -474,6 +474,22 @@ class OracleDialect implements DbDialect {
|
||||
return '';
|
||||
}
|
||||
|
||||
getModifyTableInfoSql(tableData: any): string {
|
||||
let schemaArr = tableData.db.split('/');
|
||||
let schema = schemaArr.length > 1 ? schemaArr[schemaArr.length - 1] : schemaArr[0];
|
||||
|
||||
let sql = '';
|
||||
if (tableData.tableComment != tableData.oldTableComment) {
|
||||
let dbTable = `${this.quoteIdentifier(schema)}.${this.quoteIdentifier(tableData.oldTableName)}`;
|
||||
sql = `COMMENT ON TABLE ${dbTable} is '${tableData.tableComment}';`;
|
||||
}
|
||||
if (tableData.tableName != tableData.oldTableName) {
|
||||
let dbTable = `${this.quoteIdentifier(schema)}.${this.quoteIdentifier(tableData.oldTableName)}`;
|
||||
sql += `ALTER TABLE ${dbTable} RENAME TO ${this.quoteIdentifier(tableData.tableName)}`;
|
||||
}
|
||||
return sql;
|
||||
}
|
||||
|
||||
getDataType(columnType: string): DataType {
|
||||
if (DbInst.isNumber(columnType)) {
|
||||
return DataType.Number;
|
||||
|
||||
@@ -421,6 +421,22 @@ class PostgresqlDialect implements DbDialect {
|
||||
return '';
|
||||
}
|
||||
|
||||
getModifyTableInfoSql(tableData: any): string {
|
||||
let schemaArr = tableData.db.split('/');
|
||||
let schema = schemaArr.length > 1 ? schemaArr[schemaArr.length - 1] : schemaArr[0];
|
||||
|
||||
let sql = '';
|
||||
if (tableData.tableComment != tableData.oldTableComment) {
|
||||
let dbTable = `${this.quoteIdentifier(schema)}.${this.quoteIdentifier(tableData.oldTableName)}`;
|
||||
sql = `COMMENT ON TABLE ${dbTable} is '${tableData.tableComment}';`;
|
||||
}
|
||||
if (tableData.tableName != tableData.oldTableName) {
|
||||
let dbTable = `${this.quoteIdentifier(schema)}.${this.quoteIdentifier(tableData.oldTableName)}`;
|
||||
sql += `ALTER TABLE ${dbTable} RENAME TO ${this.quoteIdentifier(tableData.tableName)}`;
|
||||
}
|
||||
return sql;
|
||||
}
|
||||
|
||||
getDataType(columnType: string): DataType {
|
||||
if (DbInst.isNumber(columnType)) {
|
||||
return DataType.Number;
|
||||
|
||||
@@ -314,6 +314,19 @@ class SqliteDialect implements DbDialect {
|
||||
return sql.join(';');
|
||||
}
|
||||
|
||||
getModifyTableInfoSql(tableData: any): string {
|
||||
let schemaArr = tableData.db.split('/');
|
||||
let schema = schemaArr.length > 1 ? schemaArr[schemaArr.length - 1] : schemaArr[0];
|
||||
|
||||
// sqlite没有表注释
|
||||
let sql = '';
|
||||
if (tableData.tableName != tableData.oldTableName) {
|
||||
let dbTable = `${this.quoteIdentifier(schema)}.${this.quoteIdentifier(tableData.oldTableName)}`;
|
||||
sql += `ALTER TABLE ${dbTable} RENAME TO ${this.quoteIdentifier(tableData.tableName)}`;
|
||||
}
|
||||
return sql;
|
||||
}
|
||||
|
||||
getDataType(columnType: string): DataType {
|
||||
if (DbInst.isNumber(columnType)) {
|
||||
return DataType.Number;
|
||||
|
||||
@@ -86,6 +86,24 @@ func (od *OracleDialect) GetColumns(tableNames ...string) ([]dbi.Column, error)
|
||||
return fmt.Sprintf("'%s'", dbType.RemoveQuote(val))
|
||||
}), ",")
|
||||
|
||||
// 如果表数量超过了1000,需要分批查询
|
||||
if len(tableNames) > 1000 {
|
||||
columns := make([]dbi.Column, 0)
|
||||
for i := 0; i < len(tableNames); i += 1000 {
|
||||
end := i + 1000
|
||||
if end > len(tableNames) {
|
||||
end = len(tableNames)
|
||||
}
|
||||
tables := tableNames[i:end]
|
||||
cols, err := od.GetColumns(tables...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
columns = append(columns, cols...)
|
||||
}
|
||||
return columns, nil
|
||||
}
|
||||
|
||||
_, res, err := od.dc.Query(fmt.Sprintf(dbi.GetLocalSql(ORACLE_META_FILE, ORACLE_COLUMN_MA_KEY), tableName))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
|
||||
Reference in New Issue
Block a user