mirror of
https://github.com/DeNNiiInc/dbgate.git
synced 2026-04-24 07:15:58 +00:00
drop table optimalization - dont drop references in mysql and slite
This commit is contained in:
44
integration-tests/__tests__/alter-database.spec.js
Normal file
44
integration-tests/__tests__/alter-database.spec.js
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
const stableStringify = require('json-stable-stringify');
|
||||||
|
const _ = require('lodash');
|
||||||
|
const fp = require('lodash/fp');
|
||||||
|
const uuidv1 = require('uuid/v1');
|
||||||
|
const { testWrapper } = require('../tools');
|
||||||
|
const engines = require('../engines');
|
||||||
|
const { getAlterDatabaseScript, extendDatabaseInfo, generateDbPairingId } = require('dbgate-tools');
|
||||||
|
|
||||||
|
async function testDatabaseDiff(conn, driver, mangle) {
|
||||||
|
await driver.query(conn, `create table t0 (id int not null primary key)`);
|
||||||
|
|
||||||
|
await driver.query(
|
||||||
|
conn,
|
||||||
|
`create table t1 (
|
||||||
|
col_pk int not null primary key,
|
||||||
|
col_fk int null references t0(id)
|
||||||
|
)`
|
||||||
|
);
|
||||||
|
|
||||||
|
const structure1 = generateDbPairingId(extendDatabaseInfo(await driver.analyseFull(conn)));
|
||||||
|
let structure2 = _.cloneDeep(structure1);
|
||||||
|
mangle(structure2);
|
||||||
|
structure2 = extendDatabaseInfo(structure2);
|
||||||
|
|
||||||
|
const sql = getAlterDatabaseScript(structure1, structure2, {}, structure2, driver);
|
||||||
|
console.log('RUNNING ALTER SQL', driver.engine, ':', sql);
|
||||||
|
|
||||||
|
await driver.script(conn, sql);
|
||||||
|
|
||||||
|
const structure2Real = extendDatabaseInfo(await driver.analyseFull(conn));
|
||||||
|
|
||||||
|
expect(structure2Real.tables.length).toEqual(structure2.tables.length);
|
||||||
|
}
|
||||||
|
|
||||||
|
describe('Alter database', () => {
|
||||||
|
test.each(engines.map(engine => [engine.label, engine]))(
|
||||||
|
'Drop referenced table - %s',
|
||||||
|
testWrapper(async (conn, driver, engine) => {
|
||||||
|
await testDatabaseDiff(conn, driver, db => {
|
||||||
|
_.remove(db.tables, x => x.pureName == 't0');
|
||||||
|
});
|
||||||
|
})
|
||||||
|
);
|
||||||
|
});
|
||||||
@@ -68,7 +68,7 @@ function engines_columns_source() {
|
|||||||
return _.flatten(engines.map(engine => TESTED_COLUMNS.map(column => [engine.label, column, engine])));
|
return _.flatten(engines.map(engine => TESTED_COLUMNS.map(column => [engine.label, column, engine])));
|
||||||
}
|
}
|
||||||
|
|
||||||
describe('Alter processor', () => {
|
describe('Alter table', () => {
|
||||||
test.each(engines.map(engine => [engine.label, engine]))(
|
test.each(engines.map(engine => [engine.label, engine]))(
|
||||||
'Add column - %s',
|
'Add column - %s',
|
||||||
testWrapper(async (conn, driver, engine) => {
|
testWrapper(async (conn, driver, engine) => {
|
||||||
@@ -116,11 +116,11 @@ const engines = [
|
|||||||
|
|
||||||
const filterLocal = [
|
const filterLocal = [
|
||||||
// filter local testing
|
// filter local testing
|
||||||
'-MySQL',
|
'MySQL',
|
||||||
'-PostgreSQL',
|
'PostgreSQL',
|
||||||
'SQL Server',
|
'SQL Server',
|
||||||
'-SQLite',
|
'SQLite',
|
||||||
'-CockroachDB',
|
'CockroachDB',
|
||||||
];
|
];
|
||||||
|
|
||||||
module.exports = process.env.CITEST
|
module.exports = process.env.CITEST
|
||||||
|
|||||||
@@ -248,13 +248,15 @@ export class AlterPlan {
|
|||||||
|
|
||||||
if (op.operationType == 'dropTable') {
|
if (op.operationType == 'dropTable') {
|
||||||
return [
|
return [
|
||||||
...(op.oldObject.dependencies || []).map(oldObject => {
|
...(this.dialect.dropReferencesWhenDropTable
|
||||||
const opRes: AlterOperation = {
|
? (op.oldObject.dependencies || []).map(oldObject => {
|
||||||
operationType: 'dropConstraint',
|
const opRes: AlterOperation = {
|
||||||
oldObject,
|
operationType: 'dropConstraint',
|
||||||
};
|
oldObject,
|
||||||
return opRes;
|
};
|
||||||
}),
|
return opRes;
|
||||||
|
})
|
||||||
|
: []),
|
||||||
op,
|
op,
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|||||||
2
packages/types/dialect.d.ts
vendored
2
packages/types/dialect.d.ts
vendored
@@ -30,4 +30,6 @@ export interface SqlDialect {
|
|||||||
dropUnique?: boolean;
|
dropUnique?: boolean;
|
||||||
createCheck?: boolean;
|
createCheck?: boolean;
|
||||||
dropCheck?: boolean;
|
dropCheck?: boolean;
|
||||||
|
|
||||||
|
dropReferencesWhenDropTable?: boolean;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,6 +33,8 @@ const dialect = {
|
|||||||
dropUnique: true,
|
dropUnique: true,
|
||||||
createCheck: true,
|
createCheck: true,
|
||||||
dropCheck: true,
|
dropCheck: true,
|
||||||
|
|
||||||
|
dropReferencesWhenDropTable: true,
|
||||||
};
|
};
|
||||||
|
|
||||||
/** @type {import('dbgate-types').EngineDriver} */
|
/** @type {import('dbgate-types').EngineDriver} */
|
||||||
|
|||||||
@@ -28,6 +28,8 @@ const dialect = {
|
|||||||
dropUnique: true,
|
dropUnique: true,
|
||||||
createCheck: true,
|
createCheck: true,
|
||||||
dropCheck: true,
|
dropCheck: true,
|
||||||
|
|
||||||
|
dropReferencesWhenDropTable: false,
|
||||||
};
|
};
|
||||||
|
|
||||||
const mysqlDriverBase = {
|
const mysqlDriverBase = {
|
||||||
|
|||||||
@@ -30,6 +30,8 @@ const dialect = {
|
|||||||
dropUnique: true,
|
dropUnique: true,
|
||||||
createCheck: true,
|
createCheck: true,
|
||||||
dropCheck: true,
|
dropCheck: true,
|
||||||
|
|
||||||
|
dropReferencesWhenDropTable: true,
|
||||||
};
|
};
|
||||||
|
|
||||||
const postgresDriverBase = {
|
const postgresDriverBase = {
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ const dialect = {
|
|||||||
dropForeignKey: false,
|
dropForeignKey: false,
|
||||||
createPrimaryKey: false,
|
createPrimaryKey: false,
|
||||||
dropPrimaryKey: false,
|
dropPrimaryKey: false,
|
||||||
|
dropReferencesWhenDropTable: false,
|
||||||
};
|
};
|
||||||
|
|
||||||
/** @type {import('dbgate-types').EngineDriver} */
|
/** @type {import('dbgate-types').EngineDriver} */
|
||||||
|
|||||||
Reference in New Issue
Block a user