mirror of
https://github.com/DeNNiiInc/dbgate.git
synced 2026-04-30 16:13:58 +00:00
editing table works
This commit is contained in:
@@ -62,10 +62,13 @@ export function dumpSqlSelect(dmp: SqlDumper, cmd: Select) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export function dumpSqlUpdate(dmp: SqlDumper, cmd: Update) {
|
export function dumpSqlUpdate(dmp: SqlDumper, cmd: Update) {
|
||||||
dmp.put('^update ');
|
if (cmd.alterTableUpdateSyntax) {
|
||||||
dumpSqlSourceRef(dmp, cmd.from);
|
dmp.put('^alter ^table %f &n^update ', cmd.from?.name);
|
||||||
|
} else {
|
||||||
dmp.put('&n^set ');
|
dmp.put('^update ');
|
||||||
|
dumpSqlSourceRef(dmp, cmd.from);
|
||||||
|
dmp.put('&n^set ');
|
||||||
|
}
|
||||||
dmp.put('&>');
|
dmp.put('&>');
|
||||||
dmp.putCollection(', ', cmd.fields, col => {
|
dmp.putCollection(', ', cmd.fields, col => {
|
||||||
dmp.put('%i=', col.targetColumn);
|
dmp.put('%i=', col.targetColumn);
|
||||||
@@ -81,8 +84,14 @@ export function dumpSqlUpdate(dmp: SqlDumper, cmd: Update) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export function dumpSqlDelete(dmp: SqlDumper, cmd: Delete) {
|
export function dumpSqlDelete(dmp: SqlDumper, cmd: Delete) {
|
||||||
dmp.put('^delete ^from ');
|
if (cmd.alterTableDeleteSyntax) {
|
||||||
dumpSqlSourceRef(dmp, cmd.from);
|
dmp.put('^alter ^table ');
|
||||||
|
dumpSqlSourceRef(dmp, cmd.from);
|
||||||
|
dmp.put('^delete ');
|
||||||
|
} else {
|
||||||
|
dmp.put('^delete ^from ');
|
||||||
|
dumpSqlSourceRef(dmp, cmd.from);
|
||||||
|
}
|
||||||
|
|
||||||
if (cmd.where) {
|
if (cmd.where) {
|
||||||
dmp.put('&n^where ');
|
dmp.put('&n^where ');
|
||||||
|
|||||||
@@ -26,12 +26,17 @@ export interface Update {
|
|||||||
fields: UpdateField[];
|
fields: UpdateField[];
|
||||||
from: FromDefinition;
|
from: FromDefinition;
|
||||||
where?: Condition;
|
where?: Condition;
|
||||||
|
// ALTER TABLE xxx UPDATE col1=val1 - syntax for ClickHouse
|
||||||
|
alterTableUpdateSyntax?: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface Delete {
|
export interface Delete {
|
||||||
commandType: 'delete';
|
commandType: 'delete';
|
||||||
from: FromDefinition;
|
from: FromDefinition;
|
||||||
where?: Condition;
|
where?: Condition;
|
||||||
|
|
||||||
|
// ALTER TABLE xxx DELETE - syntax for ClickHouse
|
||||||
|
alterTableDeleteSyntax?: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface Insert {
|
export interface Insert {
|
||||||
|
|||||||
@@ -173,4 +173,8 @@ export const driverBase = {
|
|||||||
parseSqlNull: true,
|
parseSqlNull: true,
|
||||||
parseHexAsBuffer: true,
|
parseHexAsBuffer: true,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
createSaveChangeSetScript(changeSet, dbinfo, defaultCreator) {
|
||||||
|
return defaultCreator(changeSet, dbinfo);
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|||||||
5
packages/types/engines.d.ts
vendored
5
packages/types/engines.d.ts
vendored
@@ -223,6 +223,11 @@ export interface EngineDriver extends FilterBehaviourProvider {
|
|||||||
getCollectionExportQueryJson(collection: string, condition: any, sort?: CollectionSortDefinition): {};
|
getCollectionExportQueryJson(collection: string, condition: any, sort?: CollectionSortDefinition): {};
|
||||||
getScriptTemplates(objectTypeField: keyof DatabaseInfo): { label: string; scriptTemplate: string }[];
|
getScriptTemplates(objectTypeField: keyof DatabaseInfo): { label: string; scriptTemplate: string }[];
|
||||||
getScriptTemplateContent(scriptTemplate: string, props: any): Promise<string>;
|
getScriptTemplateContent(scriptTemplate: string, props: any): Promise<string>;
|
||||||
|
createSaveChangeSetScript(
|
||||||
|
changeSet: any,
|
||||||
|
dbinfo: DatabaseInfo,
|
||||||
|
defaultCreator: (changeSet: any, dbinfo: DatabaseInfo) => any
|
||||||
|
): any[];
|
||||||
|
|
||||||
analyserClass?: any;
|
analyserClass?: any;
|
||||||
dumperClass?: any;
|
dumperClass?: any;
|
||||||
|
|||||||
@@ -71,10 +71,7 @@
|
|||||||
changeSetToSql,
|
changeSetToSql,
|
||||||
createChangeSet,
|
createChangeSet,
|
||||||
createGridCache,
|
createGridCache,
|
||||||
createGridConfig,
|
|
||||||
getDeleteCascades,
|
getDeleteCascades,
|
||||||
TableFormViewDisplay,
|
|
||||||
TableGridDisplay,
|
|
||||||
} from 'dbgate-datalib';
|
} from 'dbgate-datalib';
|
||||||
import { findEngineDriver } from 'dbgate-tools';
|
import { findEngineDriver } from 'dbgate-tools';
|
||||||
import { reloadDataCacheFunc } from 'dbgate-datalib';
|
import { reloadDataCacheFunc } from 'dbgate-datalib';
|
||||||
@@ -160,7 +157,11 @@
|
|||||||
|
|
||||||
export function save() {
|
export function save() {
|
||||||
const driver = findEngineDriver($connection, $extensions);
|
const driver = findEngineDriver($connection, $extensions);
|
||||||
const script = changeSetToSql($changeSetStore?.value, $dbinfo);
|
|
||||||
|
const script = driver.createSaveChangeSetScript($changeSetStore?.value, $dbinfo, () =>
|
||||||
|
changeSetToSql($changeSetStore?.value, $dbinfo)
|
||||||
|
);
|
||||||
|
|
||||||
const deleteCascades = getDeleteCascades($changeSetStore?.value, $dbinfo);
|
const deleteCascades = getDeleteCascades($changeSetStore?.value, $dbinfo);
|
||||||
const sql = scriptToSql(driver, script);
|
const sql = scriptToSql(driver, script);
|
||||||
const deleteCascadesScripts = _.map(deleteCascades, ({ title, commands }) => ({
|
const deleteCascadesScripts = _.map(deleteCascades, ({ title, commands }) => ({
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
const { driverBase } = require('dbgate-tools');
|
const { driverBase } = require('dbgate-tools');
|
||||||
const Dumper = require('./Dumper');
|
const Dumper = require('./Dumper');
|
||||||
const { mysqlSplitterOptions } = require('dbgate-query-splitter/lib/options');
|
const { mysqlSplitterOptions } = require('dbgate-query-splitter/lib/options');
|
||||||
|
const _cloneDeepWith = require('lodash/cloneDeepWith');
|
||||||
|
|
||||||
/** @type {import('dbgate-types').SqlDialect} */
|
/** @type {import('dbgate-types').SqlDialect} */
|
||||||
const dialect = {
|
const dialect = {
|
||||||
@@ -40,6 +41,35 @@ const driver = {
|
|||||||
usage == 'editor'
|
usage == 'editor'
|
||||||
? { ...mysqlSplitterOptions, ignoreComments: true, preventSingleLineSplit: true }
|
? { ...mysqlSplitterOptions, ignoreComments: true, preventSingleLineSplit: true }
|
||||||
: mysqlSplitterOptions,
|
: mysqlSplitterOptions,
|
||||||
|
|
||||||
|
createSaveChangeSetScript(changeSet, dbinfo, defaultCreator) {
|
||||||
|
function removeConditionSource(cmd) {
|
||||||
|
cmd.where = _cloneDeepWith(cmd.where, (expr) => {
|
||||||
|
if (expr.exprType == 'column') {
|
||||||
|
return {
|
||||||
|
...expr,
|
||||||
|
source: undefined,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
const res = defaultCreator(changeSet, dbinfo);
|
||||||
|
for (const cmd of res) {
|
||||||
|
if (cmd.commandType == 'update') {
|
||||||
|
cmd.alterTableUpdateSyntax = true;
|
||||||
|
removeConditionSource(cmd);
|
||||||
|
}
|
||||||
|
if (cmd.commandType == 'delete') {
|
||||||
|
const table = dbinfo?.tables?.find((x) => x.pureName == cmd?.from?.name?.pureName);
|
||||||
|
if (table?.tableEngine != 'MergeTree') {
|
||||||
|
cmd.alterTableDeleteSyntax = true;
|
||||||
|
}
|
||||||
|
removeConditionSource(cmd);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
module.exports = driver;
|
module.exports = driver;
|
||||||
|
|||||||
Reference in New Issue
Block a user