mirror of
https://gitee.com/dromara/mayfly-go
synced 2025-11-04 00:10: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>
|
<script lang="ts" setup>
|
||||||
import { defineAsyncComponent, h, onBeforeUnmount, onMounted, reactive, ref, toRefs } from 'vue';
|
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 { formatByteSize } from '@/common/utils/format';
|
||||||
import { DbInst, registerDbCompletionItemProvider, TabInfo, TabType } from './db';
|
import { DbInst, registerDbCompletionItemProvider, TabInfo, TabType } from './db';
|
||||||
import { NodeType, TagTreeNode } from '../component/tag';
|
import { NodeType, TagTreeNode } from '../component/tag';
|
||||||
@@ -182,6 +182,7 @@ import { sleep } from '@/common/utils/loading';
|
|||||||
import { TagResourceTypeEnum } from '@/common/commonEnum';
|
import { TagResourceTypeEnum } from '@/common/commonEnum';
|
||||||
import { Pane, Splitpanes } from 'splitpanes';
|
import { Pane, Splitpanes } from 'splitpanes';
|
||||||
import { useEventListener } from '@vueuse/core';
|
import { useEventListener } from '@vueuse/core';
|
||||||
|
import SqlExecBox from '@/views/ops/db/component/sqleditor/SqlExecBox';
|
||||||
|
|
||||||
const DbTableOp = defineAsyncComponent(() => import('./component/table/DbTableOp.vue'));
|
const DbTableOp = defineAsyncComponent(() => import('./component/table/DbTableOp.vue'));
|
||||||
const DbSqlEditor = defineAsyncComponent(() => import('./component/sqleditor/DbSqlEditor.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)
|
const NodeTypeTable = new NodeType(SqlExecNodeType.Table)
|
||||||
.withContextMenuItems([
|
.withContextMenuItems([
|
||||||
new ContextmenuItem('copyTable', '复制表').withIcon('copyDocument').withOnClick((data: any) => onCopyTable(data)),
|
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('editTable', '编辑表').withIcon('edit').withOnClick((data: any) => onEditTable(data)),
|
||||||
new ContextmenuItem('delTable', '删除表').withIcon('Delete').withOnClick((data: any) => onDeleteTable(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) => {
|
const onCopyTable = async (data: any) => {
|
||||||
let { db, id, tableName, parentKey } = data.params;
|
let { db, id, tableName, parentKey } = data.params;
|
||||||
|
|
||||||
|
|||||||
@@ -262,6 +262,8 @@ const state = reactive({
|
|||||||
},
|
},
|
||||||
tableName: '',
|
tableName: '',
|
||||||
tableComment: '',
|
tableComment: '',
|
||||||
|
oldTableName: '',
|
||||||
|
oldTableComment: '',
|
||||||
height: 450,
|
height: 450,
|
||||||
db: '',
|
db: '',
|
||||||
},
|
},
|
||||||
@@ -410,6 +412,7 @@ const filterChangedData = (oldArr: object[], nowArr: object[], key: string): { d
|
|||||||
|
|
||||||
const genSql = () => {
|
const genSql = () => {
|
||||||
let data = state.tableData;
|
let data = state.tableData;
|
||||||
|
console.log(data);
|
||||||
// 创建表
|
// 创建表
|
||||||
if (!props.data?.edit) {
|
if (!props.data?.edit) {
|
||||||
let createTable = dbDialect.getCreateTableSql(data);
|
let createTable = dbDialect.getCreateTableSql(data);
|
||||||
@@ -424,12 +427,14 @@ const genSql = () => {
|
|||||||
let colSql = changeColData.changed ? dbDialect.getModifyColumnSql(data, data.tableName, changeColData) : '';
|
let colSql = changeColData.changed ? dbDialect.getModifyColumnSql(data, data.tableName, changeColData) : '';
|
||||||
// 修改索引
|
// 修改索引
|
||||||
let changeIdxData = filterChangedData(state.tableData.indexs.oldIndexs, state.tableData.indexs.res, 'indexName');
|
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 = [];
|
let sqlArr = [];
|
||||||
colSql && sqlArr.push(colSql);
|
colSql && sqlArr.push(colSql);
|
||||||
idxSql && sqlArr.push(idxSql);
|
idxSql && sqlArr.push(idxSql);
|
||||||
|
tableInfoSql && sqlArr.push(tableInfoSql);
|
||||||
|
|
||||||
return sqlArr.join(';');
|
return sqlArr.join(';');
|
||||||
}
|
}
|
||||||
@@ -486,13 +491,18 @@ watch(
|
|||||||
// 回显表名表注释
|
// 回显表名表注释
|
||||||
state.tableData.tableName = row.tableName;
|
state.tableData.tableName = row.tableName;
|
||||||
state.tableData.tableComment = row.tableComment;
|
state.tableData.tableComment = row.tableComment;
|
||||||
|
state.tableData.oldTableName = row.tableName;
|
||||||
|
state.tableData.oldTableComment = row.tableComment;
|
||||||
state.tableData.db = props.db!;
|
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) {
|
if (columns && Array.isArray(columns) && columns.length > 0) {
|
||||||
state.tableData.fields.oldFields = [];
|
|
||||||
state.tableData.fields.res = [];
|
|
||||||
// 索引列下拉选
|
|
||||||
state.tableData.indexs.columns = [];
|
|
||||||
columns.forEach((a) => {
|
columns.forEach((a) => {
|
||||||
let typeObj = a.columnType.replace(')', '').split('(');
|
let typeObj = a.columnType.replace(')', '').split('(');
|
||||||
let type = typeObj[0];
|
let type = typeObj[0];
|
||||||
@@ -521,10 +531,9 @@ watch(
|
|||||||
state.tableData.indexs.columns.push({ name: a.columnName, remark: a.columnComment });
|
state.tableData.indexs.columns.push({ name: a.columnName, remark: a.columnComment });
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// 回显索引
|
// 回显索引
|
||||||
if (indexs && Array.isArray(indexs) && indexs.length > 0) {
|
if (indexs && Array.isArray(indexs) && indexs.length > 0) {
|
||||||
state.tableData.indexs.oldIndexs = [];
|
|
||||||
state.tableData.indexs.res = [];
|
|
||||||
// 索引过滤掉主键
|
// 索引过滤掉主键
|
||||||
indexs
|
indexs
|
||||||
.filter((a) => a.indexName !== 'PRIMARY')
|
.filter((a) => a.indexName !== 'PRIMARY')
|
||||||
|
|||||||
@@ -663,6 +663,22 @@ class DMDialect implements DbDialect {
|
|||||||
}
|
}
|
||||||
return '';
|
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 {
|
getDataType(columnType: string): DataType {
|
||||||
if (DbInst.isNumber(columnType)) {
|
if (DbInst.isNumber(columnType)) {
|
||||||
|
|||||||
@@ -222,6 +222,9 @@ export interface DbDialect {
|
|||||||
*/
|
*/
|
||||||
getModifyIndexSql(tableData: any, tableName: string, changeData: { del: any[]; add: any[]; upd: any[] }): string;
|
getModifyIndexSql(tableData: any, tableName: string, changeData: { del: any[]; add: any[]; upd: any[] }): string;
|
||||||
|
|
||||||
|
/** 生成编辑表信息sql */
|
||||||
|
getModifyTableInfoSql(tableData: any): string;
|
||||||
|
|
||||||
/** 通过数据库字段类型,返回基本数据类型 */
|
/** 通过数据库字段类型,返回基本数据类型 */
|
||||||
getDataType(columnType: string): DataType;
|
getDataType(columnType: string): DataType;
|
||||||
|
|
||||||
|
|||||||
@@ -399,6 +399,37 @@ ELSE
|
|||||||
return arr.join(';');
|
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 {
|
getDataType(columnType: string): DataType {
|
||||||
if (DbInst.isNumber(columnType)) {
|
if (DbInst.isNumber(columnType)) {
|
||||||
return DataType.Number;
|
return DataType.Number;
|
||||||
|
|||||||
@@ -323,6 +323,18 @@ class MysqlDialect implements DbDialect {
|
|||||||
return '';
|
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 {
|
getDataType(columnType: string): DataType {
|
||||||
if (DbInst.isNumber(columnType)) {
|
if (DbInst.isNumber(columnType)) {
|
||||||
return DataType.Number;
|
return DataType.Number;
|
||||||
|
|||||||
@@ -474,6 +474,22 @@ class OracleDialect implements DbDialect {
|
|||||||
return '';
|
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 {
|
getDataType(columnType: string): DataType {
|
||||||
if (DbInst.isNumber(columnType)) {
|
if (DbInst.isNumber(columnType)) {
|
||||||
return DataType.Number;
|
return DataType.Number;
|
||||||
|
|||||||
@@ -421,6 +421,22 @@ class PostgresqlDialect implements DbDialect {
|
|||||||
return '';
|
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 {
|
getDataType(columnType: string): DataType {
|
||||||
if (DbInst.isNumber(columnType)) {
|
if (DbInst.isNumber(columnType)) {
|
||||||
return DataType.Number;
|
return DataType.Number;
|
||||||
|
|||||||
@@ -314,6 +314,19 @@ class SqliteDialect implements DbDialect {
|
|||||||
return sql.join(';');
|
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 {
|
getDataType(columnType: string): DataType {
|
||||||
if (DbInst.isNumber(columnType)) {
|
if (DbInst.isNumber(columnType)) {
|
||||||
return DataType.Number;
|
return DataType.Number;
|
||||||
|
|||||||
@@ -86,6 +86,24 @@ func (od *OracleDialect) GetColumns(tableNames ...string) ([]dbi.Column, error)
|
|||||||
return fmt.Sprintf("'%s'", dbType.RemoveQuote(val))
|
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))
|
_, res, err := od.dc.Query(fmt.Sprintf(dbi.GetLocalSql(ORACLE_META_FILE, ORACLE_COLUMN_MA_KEY), tableName))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
|||||||
Reference in New Issue
Block a user