diff --git a/integration-tests/__tests__/deploy-database.spec.js b/integration-tests/__tests__/deploy-database.spec.js index db0a542cf..b8a91e68b 100644 --- a/integration-tests/__tests__/deploy-database.spec.js +++ b/integration-tests/__tests__/deploy-database.spec.js @@ -5,6 +5,7 @@ const _ = require('lodash'); const engines = require('../engines'); const deployDb = require('dbgate-api/src/shell/deployDb'); const { databaseInfoFromYamlModel } = require('dbgate-tools'); +const generateDeploySql = require('dbgate-api/src/shell/generateDeploySql'); function checkStructure(structure, model) { const expected = databaseInfoFromYamlModel(model); @@ -17,6 +18,13 @@ function checkStructure(structure, model) { async function testDatabaseDeploy(conn, driver, dbModelsYaml) { for (const loadedDbModel of dbModelsYaml) { + const sql = await generateDeploySql({ + systemConnection: conn, + driver, + loadedDbModel, + }); + expect(sql.toUpperCase().includes('DROP ')).toBeFalsy(); + await deployDb({ systemConnection: conn, driver, diff --git a/integration-tests/engines.js b/integration-tests/engines.js index b11d40cb2..ed1bcaf09 100644 --- a/integration-tests/engines.js +++ b/integration-tests/engines.js @@ -116,11 +116,11 @@ const engines = [ const filterLocal = [ // filter local testing - 'MySQL', - 'PostgreSQL', - 'SQL Server', + '-MySQL', + '-PostgreSQL', + '-SQL Server', 'SQLite', - 'CockroachDB', + '-CockroachDB', ]; module.exports = process.env.CITEST diff --git a/packages/api/src/shell/deployDb.js b/packages/api/src/shell/deployDb.js index 5f28c5794..8c2348fcf 100644 --- a/packages/api/src/shell/deployDb.js +++ b/packages/api/src/shell/deployDb.js @@ -10,7 +10,7 @@ async function deployDb({ connection, systemConnection, driver, analysedStructur modelFolder, loadedDbModel, }); - console.log('RUNNING DEPLOY SCRIPT:', sql); + // console.log('RUNNING DEPLOY SCRIPT:', sql); await executeQuery({ connection, systemConnection, driver, sql }); } diff --git a/packages/api/src/shell/executeQuery.js b/packages/api/src/shell/executeQuery.js index 39c5bdb3b..14d39238a 100644 --- a/packages/api/src/shell/executeQuery.js +++ b/packages/api/src/shell/executeQuery.js @@ -1,4 +1,3 @@ -const { splitQuery } = require('dbgate-query-splitter'); const requireEngineDriver = require('../utility/requireEngineDriver'); const connectUtility = require('../utility/connectUtility'); @@ -9,12 +8,7 @@ async function executeQuery({ connection = undefined, systemConnection = undefin const pool = systemConnection || (await connectUtility(driver, connection)); console.log(`Connected.`); - for (const sqlItem of splitQuery(sql, driver.getQuerySplitterOptions('script'))) { - console.log('Executing query', sqlItem); - await driver.query(pool, sqlItem, { discardResult: true }); - } - - console.log(`Query finished`); + await driver.script(pool, sql); } module.exports = executeQuery; diff --git a/packages/api/src/shell/generateDeploySql.js b/packages/api/src/shell/generateDeploySql.js index 0253e64be..57b7a6452 100644 --- a/packages/api/src/shell/generateDeploySql.js +++ b/packages/api/src/shell/generateDeploySql.js @@ -3,6 +3,7 @@ const { generateDbPairingId, matchPairedObjects, databaseInfoFromYamlModel, + extendDatabaseInfo, } = require('dbgate-tools'); const importDbModel = require('../utility/importDbModel'); const requireEngineDriver = require('../utility/requireEngineDriver'); @@ -23,9 +24,9 @@ async function generateDeploySql({ } const deployedModel = generateDbPairingId( - loadedDbModel ? databaseInfoFromYamlModel(loadedDbModel) : await importDbModel(modelFolder) + extendDatabaseInfo(loadedDbModel ? databaseInfoFromYamlModel(loadedDbModel) : await importDbModel(modelFolder)) ); - const currentModel = generateDbPairingId(analysedStructure); + const currentModel = generateDbPairingId(extendDatabaseInfo(analysedStructure)); const currentModelPaired = matchPairedObjects(deployedModel, currentModel); const { sql } = getAlterDatabaseScript(currentModelPaired, deployedModel, {}, deployedModel, driver); return sql; diff --git a/packages/tools/src/database-info-alter-processor.ts b/packages/tools/src/database-info-alter-processor.ts index 916c1c06a..e95909131 100644 --- a/packages/tools/src/database-info-alter-processor.ts +++ b/packages/tools/src/database-info-alter-processor.ts @@ -36,16 +36,19 @@ export class DatabaseInfoAlterProcessor { createColumn(column: ColumnInfo) { const table = this.db.tables.find(x => x.pureName == column.pureName && x.schemaName == column.schemaName); + if (!table) throw new Error(`createColumn error, cannot find table: ${column.schemaName}.${column.pureName}`); table.columns.push(column); } changeColumn(oldColumn: ColumnInfo, newColumn: ColumnInfo) { const table = this.db.tables.find(x => x.pureName == oldColumn.pureName && x.schemaName == oldColumn.schemaName); + if (!table) throw new Error(`changeColumn error, cannot find table: ${oldColumn.schemaName}.${oldColumn.pureName}`); table.columns = table.columns.map(x => (x.columnName == oldColumn.columnName ? newColumn : x)); } dropColumn(column: ColumnInfo) { const table = this.db.tables.find(x => x.pureName == column.pureName && x.schemaName == column.schemaName); + if (!table) throw new Error(`dropColumn error, cannot find table: ${column.schemaName}.${column.pureName}`); _.remove(table.columns, x => x.columnName == column.columnName); } diff --git a/packages/tools/src/diffTools.ts b/packages/tools/src/diffTools.ts index 251a56bec..1b2527461 100644 --- a/packages/tools/src/diffTools.ts +++ b/packages/tools/src/diffTools.ts @@ -11,7 +11,6 @@ import _ from 'lodash'; import uuidv1 from 'uuid/v1'; import { AlterPlan } from './alterPlan'; import stableStringify from 'json-stable-stringify'; -import { isArray } from 'lodash'; type DbDiffSchemaMode = 'strict' | 'ignore' | 'ignoreImplicit'; @@ -117,6 +116,9 @@ export function testEqualColumns( // return false; //} if (a.computedExpression != b.computedExpression) { + console.debug( + `Column ${a.columnName}, ${b.columnName}: different computed expression: ${a.computedExpression}, ${b.computedExpression}` + ); // opts.DiffLogger.Trace( // 'Column {0}, {1}: different computed expression: {2}; {3}', // a, @@ -132,6 +134,10 @@ export function testEqualColumns( if (checkDefault) { if (a.defaultValue == null) { if (a.defaultValue != b.defaultValue) { + console.debug( + `Column ${a.columnName}, ${b.columnName}: different default value: ${a.defaultValue}, ${b.defaultValue}` + ); + // opts.DiffLogger.Trace( // 'Column {0}, {1}: different default values: {2}; {3}', // a, @@ -143,6 +149,10 @@ export function testEqualColumns( } } else { if (a.defaultValue != b.defaultValue) { + console.debug( + `Column ${a.columnName}, ${b.columnName}: different default value: ${a.defaultValue}, ${b.defaultValue}` + ); + // opts.DiffLogger.Trace( // 'Column {0}, {1}: different default values: {2}; {3}', // a, @@ -154,6 +164,10 @@ export function testEqualColumns( } } if (a.defaultConstraint != b.defaultConstraint) { + console.debug( + `Column ${a.columnName}, ${b.columnName}: different default constraint: ${a.defaultConstraint}, ${b.defaultConstraint}` + ); + // opts.DiffLogger.Trace( // 'Column {0}, {1}: different default constraint names: {2}; {3}', // a, @@ -164,15 +178,23 @@ export function testEqualColumns( return false; } } - if (a.notNull != b.notNull) { + if ((a.notNull || false) != (b.notNull || false)) { + console.debug(`Column ${a.columnName}, ${b.columnName}: different nullability: ${a.notNull}, ${b.notNull}`); + // opts.DiffLogger.Trace('Column {0}, {1}: different nullable: {2}; {3}', a, b, a.NotNull, b.NotNull); return false; } - if (a.autoIncrement != b.autoIncrement) { + if ((a.autoIncrement || false) != (b.autoIncrement || false)) { + console.debug( + `Column ${a.columnName}, ${b.columnName}: different autoincrement: ${a.autoIncrement}, ${b.autoIncrement}` + ); + // opts.DiffLogger.Trace('Column {0}, {1}: different autoincrement: {2}; {3}', a, b, a.AutoIncrement, b.AutoIncrement); return false; } - if (a.isSparse != b.isSparse) { + if ((a.isSparse || false) != (b.isSparse || false)) { + console.debug(`Column ${a.columnName}, ${b.columnName}: different is_sparse: ${a.isSparse}, ${b.isSparse}`); + // opts.DiffLogger.Trace('Column {0}, {1}: different is_sparse: {2}; {3}', a, b, a.IsSparse, b.IsSparse); return false; } @@ -215,6 +237,8 @@ function testEqualConstraints(a: ConstraintInfo, b: ConstraintInfo, opts: DbDiff export function testEqualTypes(a: ColumnInfo, b: ColumnInfo, opts: DbDiffOptions = {}) { if (a.dataType != b.dataType) { + console.debug(`Column ${a.columnName}, ${b.columnName}: different data type: ${a.dataType}, ${b.dataType}`); + // opts.DiffLogger.Trace("Column {0}, {1}: different types: {2}; {3}", a, b, a.DataType, b.DataType); return false; }