mirror of
https://github.com/DeNNiiInc/dbgate.git
synced 2026-04-29 13:23:58 +00:00
Merge branch 'master' of https://github.com/dbgate/dbgate
This commit is contained in:
@@ -10,7 +10,6 @@ const connectUtility = require('dbgate-api/src/utility/connectUtility');
|
|||||||
|
|
||||||
function checkStructure(structure, model, { checkRenameDeletedObjects = false, disallowExtraObjects = false }) {
|
function checkStructure(structure, model, { checkRenameDeletedObjects = false, disallowExtraObjects = false }) {
|
||||||
const expected = databaseInfoFromYamlModel(model);
|
const expected = databaseInfoFromYamlModel(model);
|
||||||
expect(structure.tables.length).toEqual(expected.tables.length);
|
|
||||||
|
|
||||||
for (const expectedTable of expected.tables) {
|
for (const expectedTable of expected.tables) {
|
||||||
const realTable = structure.tables.find(x => x.pureName == expectedTable.pureName);
|
const realTable = structure.tables.find(x => x.pureName == expectedTable.pureName);
|
||||||
@@ -50,8 +49,13 @@ function checkStructure(structure, model, { checkRenameDeletedObjects = false, d
|
|||||||
}
|
}
|
||||||
|
|
||||||
async function testDatabaseDeploy(conn, driver, dbModelsYaml, options) {
|
async function testDatabaseDeploy(conn, driver, dbModelsYaml, options) {
|
||||||
const { testEmptyLastScript, checkDeletedObjects, finalCheckAgainstModel, finalCheckAgainstFirstModel } =
|
const {
|
||||||
options || {};
|
testEmptyLastScript,
|
||||||
|
checkDeletedObjects,
|
||||||
|
finalCheckAgainstModel,
|
||||||
|
finalCheckAgainstFirstModel,
|
||||||
|
dbdiffOptionsExtra,
|
||||||
|
} = options || {};
|
||||||
let index = 0;
|
let index = 0;
|
||||||
for (const loadedDbModel of dbModelsYaml) {
|
for (const loadedDbModel of dbModelsYaml) {
|
||||||
const { sql, isEmpty } = await generateDeploySql({
|
const { sql, isEmpty } = await generateDeploySql({
|
||||||
@@ -59,6 +63,7 @@ async function testDatabaseDeploy(conn, driver, dbModelsYaml, options) {
|
|||||||
connection: conn.isPreparedOnly ? conn : undefined,
|
connection: conn.isPreparedOnly ? conn : undefined,
|
||||||
driver,
|
driver,
|
||||||
loadedDbModel,
|
loadedDbModel,
|
||||||
|
dbdiffOptionsExtra,
|
||||||
});
|
});
|
||||||
console.debug('Generated deploy script:', sql);
|
console.debug('Generated deploy script:', sql);
|
||||||
expect(sql.toUpperCase().includes('DROP ')).toBeFalsy();
|
expect(sql.toUpperCase().includes('DROP ')).toBeFalsy();
|
||||||
@@ -73,6 +78,7 @@ async function testDatabaseDeploy(conn, driver, dbModelsYaml, options) {
|
|||||||
connection: conn.isPreparedOnly ? conn : undefined,
|
connection: conn.isPreparedOnly ? conn : undefined,
|
||||||
driver,
|
driver,
|
||||||
loadedDbModel,
|
loadedDbModel,
|
||||||
|
dbdiffOptionsExtra,
|
||||||
});
|
});
|
||||||
|
|
||||||
index++;
|
index++;
|
||||||
@@ -447,4 +453,36 @@ describe('Deploy database', () => {
|
|||||||
);
|
);
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
|
|
||||||
|
test.each(engines.map(engine => [engine.label, engine]))(
|
||||||
|
'Mark table removed - %s',
|
||||||
|
testWrapper(async (conn, driver, engine) => {
|
||||||
|
await testDatabaseDeploy(
|
||||||
|
conn,
|
||||||
|
driver,
|
||||||
|
[
|
||||||
|
[
|
||||||
|
{
|
||||||
|
name: 't1.table.yaml',
|
||||||
|
json: {
|
||||||
|
name: 't1',
|
||||||
|
columns: [
|
||||||
|
{ name: 'id', type: 'int' },
|
||||||
|
{ name: 'val', type: 'int' },
|
||||||
|
],
|
||||||
|
primaryKey: ['id'],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
[],
|
||||||
|
],
|
||||||
|
{
|
||||||
|
checkRenameDeletedObjects: true,
|
||||||
|
dbdiffOptionsExtra: {
|
||||||
|
allowTableMarkDropped: true,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
);
|
||||||
|
})
|
||||||
|
);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ async function deployDb({
|
|||||||
modelFolder,
|
modelFolder,
|
||||||
loadedDbModel,
|
loadedDbModel,
|
||||||
modelTransforms,
|
modelTransforms,
|
||||||
|
dbdiffOptionsExtra,
|
||||||
}) {
|
}) {
|
||||||
const { sql } = await generateDeploySql({
|
const { sql } = await generateDeploySql({
|
||||||
connection,
|
connection,
|
||||||
@@ -18,6 +19,7 @@ async function deployDb({
|
|||||||
modelFolder,
|
modelFolder,
|
||||||
loadedDbModel,
|
loadedDbModel,
|
||||||
modelTransforms,
|
modelTransforms,
|
||||||
|
dbdiffOptionsExtra,
|
||||||
});
|
});
|
||||||
// console.log('RUNNING DEPLOY SCRIPT:', sql);
|
// console.log('RUNNING DEPLOY SCRIPT:', sql);
|
||||||
await executeQuery({ connection, systemConnection, driver, sql, logScriptItems: true });
|
await executeQuery({ connection, systemConnection, driver, sql, logScriptItems: true });
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ async function generateDeploySql({
|
|||||||
modelFolder = undefined,
|
modelFolder = undefined,
|
||||||
loadedDbModel = undefined,
|
loadedDbModel = undefined,
|
||||||
modelTransforms = undefined,
|
modelTransforms = undefined,
|
||||||
|
dbdiffOptionsExtra = {},
|
||||||
}) {
|
}) {
|
||||||
if (!driver) driver = requireEngineDriver(connection);
|
if (!driver) driver = requireEngineDriver(connection);
|
||||||
|
|
||||||
@@ -48,6 +49,8 @@ async function generateDeploySql({
|
|||||||
noDropSqlObject: true,
|
noDropSqlObject: true,
|
||||||
noRenameTable: true,
|
noRenameTable: true,
|
||||||
noRenameColumn: true,
|
noRenameColumn: true,
|
||||||
|
|
||||||
|
...dbdiffOptionsExtra,
|
||||||
};
|
};
|
||||||
const currentModelPaired = matchPairedObjects(deployedModel, currentModel, opts);
|
const currentModelPaired = matchPairedObjects(deployedModel, currentModel, opts);
|
||||||
const currentModelPairedPreloaded = await enrichWithPreloadedRows(deployedModel, currentModelPaired, dbhan, driver);
|
const currentModelPairedPreloaded = await enrichWithPreloadedRows(deployedModel, currentModelPaired, dbhan, driver);
|
||||||
|
|||||||
@@ -441,7 +441,7 @@ export class AlterPlan {
|
|||||||
// console.log('*****************RECREATED NEEDED', op, operationType, isAllowed);
|
// console.log('*****************RECREATED NEEDED', op, operationType, isAllowed);
|
||||||
// console.log(this.dialect);
|
// console.log(this.dialect);
|
||||||
|
|
||||||
if (this.opts.noDropTable) {
|
if (this.opts.noDropTable && !this.opts.allowTableRecreateWhenNoDrop) {
|
||||||
// skip this operation, as it cannot be achieved
|
// skip this operation, as it cannot be achieved
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -35,9 +35,17 @@ export interface DbDiffOptions {
|
|||||||
ignoreConstraintNames?: boolean;
|
ignoreConstraintNames?: boolean;
|
||||||
|
|
||||||
noDropTable?: boolean;
|
noDropTable?: boolean;
|
||||||
|
allowTableRecreateWhenNoDrop?: boolean;
|
||||||
|
allowTableMarkDropped?: boolean;
|
||||||
|
|
||||||
noDropColumn?: boolean;
|
noDropColumn?: boolean;
|
||||||
|
allowColumnMarkDropped?: boolean;
|
||||||
|
|
||||||
noDropConstraint?: boolean;
|
noDropConstraint?: boolean;
|
||||||
|
|
||||||
noDropSqlObject?: boolean;
|
noDropSqlObject?: boolean;
|
||||||
|
allowSqlObjectMarkDropped?: boolean;
|
||||||
|
|
||||||
noRenameTable?: boolean;
|
noRenameTable?: boolean;
|
||||||
noRenameColumn?: boolean;
|
noRenameColumn?: boolean;
|
||||||
|
|
||||||
@@ -565,7 +573,9 @@ export function createAlterDatabasePlan(
|
|||||||
const newobj = (newDb[objectTypeField] || []).find(x => x.pairingId == oldobj.pairingId);
|
const newobj = (newDb[objectTypeField] || []).find(x => x.pairingId == oldobj.pairingId);
|
||||||
if (objectTypeField == 'tables') {
|
if (objectTypeField == 'tables') {
|
||||||
if (newobj == null) {
|
if (newobj == null) {
|
||||||
if (!opts.noDropTable) {
|
if (opts.allowTableMarkDropped) {
|
||||||
|
plan.renameTable(oldobj, '_deleted_' + oldobj.pureName);
|
||||||
|
} else if (!opts.noDropTable) {
|
||||||
plan.dropTable(oldobj);
|
plan.dropTable(oldobj);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
Reference in New Issue
Block a user