editing table works

This commit is contained in:
Jan Prochazka
2024-09-11 09:16:08 +02:00
parent 15c400747e
commit ae9ffe1aef
6 changed files with 64 additions and 10 deletions

View File

@@ -62,10 +62,13 @@ export function dumpSqlSelect(dmp: SqlDumper, cmd: Select) {
}
export function dumpSqlUpdate(dmp: SqlDumper, cmd: Update) {
dmp.put('^update ');
dumpSqlSourceRef(dmp, cmd.from);
dmp.put('&n^set ');
if (cmd.alterTableUpdateSyntax) {
dmp.put('^alter ^table %f &n^update ', cmd.from?.name);
} else {
dmp.put('^update ');
dumpSqlSourceRef(dmp, cmd.from);
dmp.put('&n^set ');
}
dmp.put('&>');
dmp.putCollection(', ', cmd.fields, col => {
dmp.put('%i=', col.targetColumn);
@@ -81,8 +84,14 @@ export function dumpSqlUpdate(dmp: SqlDumper, cmd: Update) {
}
export function dumpSqlDelete(dmp: SqlDumper, cmd: Delete) {
dmp.put('^delete ^from ');
dumpSqlSourceRef(dmp, cmd.from);
if (cmd.alterTableDeleteSyntax) {
dmp.put('^alter ^table ');
dumpSqlSourceRef(dmp, cmd.from);
dmp.put('^delete ');
} else {
dmp.put('^delete ^from ');
dumpSqlSourceRef(dmp, cmd.from);
}
if (cmd.where) {
dmp.put('&n^where ');

View File

@@ -26,12 +26,17 @@ export interface Update {
fields: UpdateField[];
from: FromDefinition;
where?: Condition;
// ALTER TABLE xxx UPDATE col1=val1 - syntax for ClickHouse
alterTableUpdateSyntax?: boolean;
}
export interface Delete {
commandType: 'delete';
from: FromDefinition;
where?: Condition;
// ALTER TABLE xxx DELETE - syntax for ClickHouse
alterTableDeleteSyntax?: boolean;
}
export interface Insert {

View File

@@ -173,4 +173,8 @@ export const driverBase = {
parseSqlNull: true,
parseHexAsBuffer: true,
},
createSaveChangeSetScript(changeSet, dbinfo, defaultCreator) {
return defaultCreator(changeSet, dbinfo);
},
};

View File

@@ -223,6 +223,11 @@ export interface EngineDriver extends FilterBehaviourProvider {
getCollectionExportQueryJson(collection: string, condition: any, sort?: CollectionSortDefinition): {};
getScriptTemplates(objectTypeField: keyof DatabaseInfo): { label: string; scriptTemplate: string }[];
getScriptTemplateContent(scriptTemplate: string, props: any): Promise<string>;
createSaveChangeSetScript(
changeSet: any,
dbinfo: DatabaseInfo,
defaultCreator: (changeSet: any, dbinfo: DatabaseInfo) => any
): any[];
analyserClass?: any;
dumperClass?: any;

View File

@@ -71,10 +71,7 @@
changeSetToSql,
createChangeSet,
createGridCache,
createGridConfig,
getDeleteCascades,
TableFormViewDisplay,
TableGridDisplay,
} from 'dbgate-datalib';
import { findEngineDriver } from 'dbgate-tools';
import { reloadDataCacheFunc } from 'dbgate-datalib';
@@ -160,7 +157,11 @@
export function save() {
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 sql = scriptToSql(driver, script);
const deleteCascadesScripts = _.map(deleteCascades, ({ title, commands }) => ({

View File

@@ -1,6 +1,7 @@
const { driverBase } = require('dbgate-tools');
const Dumper = require('./Dumper');
const { mysqlSplitterOptions } = require('dbgate-query-splitter/lib/options');
const _cloneDeepWith = require('lodash/cloneDeepWith');
/** @type {import('dbgate-types').SqlDialect} */
const dialect = {
@@ -40,6 +41,35 @@ const driver = {
usage == 'editor'
? { ...mysqlSplitterOptions, ignoreComments: true, preventSingleLineSplit: true }
: 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;