mirror of
https://github.com/DeNNiiInc/dbgate.git
synced 2026-04-20 21:46:00 +00:00
deploy db WIP
This commit is contained in:
@@ -5,6 +5,7 @@ const _ = require('lodash');
|
|||||||
const engines = require('../engines');
|
const engines = require('../engines');
|
||||||
const deployDb = require('dbgate-api/src/shell/deployDb');
|
const deployDb = require('dbgate-api/src/shell/deployDb');
|
||||||
const { databaseInfoFromYamlModel } = require('dbgate-tools');
|
const { databaseInfoFromYamlModel } = require('dbgate-tools');
|
||||||
|
const generateDeploySql = require('dbgate-api/src/shell/generateDeploySql');
|
||||||
|
|
||||||
function checkStructure(structure, model) {
|
function checkStructure(structure, model) {
|
||||||
const expected = databaseInfoFromYamlModel(model);
|
const expected = databaseInfoFromYamlModel(model);
|
||||||
@@ -17,6 +18,13 @@ function checkStructure(structure, model) {
|
|||||||
|
|
||||||
async function testDatabaseDeploy(conn, driver, dbModelsYaml) {
|
async function testDatabaseDeploy(conn, driver, dbModelsYaml) {
|
||||||
for (const loadedDbModel of dbModelsYaml) {
|
for (const loadedDbModel of dbModelsYaml) {
|
||||||
|
const sql = await generateDeploySql({
|
||||||
|
systemConnection: conn,
|
||||||
|
driver,
|
||||||
|
loadedDbModel,
|
||||||
|
});
|
||||||
|
expect(sql.toUpperCase().includes('DROP ')).toBeFalsy();
|
||||||
|
|
||||||
await deployDb({
|
await deployDb({
|
||||||
systemConnection: conn,
|
systemConnection: conn,
|
||||||
driver,
|
driver,
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ async function deployDb({ connection, systemConnection, driver, analysedStructur
|
|||||||
modelFolder,
|
modelFolder,
|
||||||
loadedDbModel,
|
loadedDbModel,
|
||||||
});
|
});
|
||||||
console.log('RUNNING DEPLOY SCRIPT:', sql);
|
// console.log('RUNNING DEPLOY SCRIPT:', sql);
|
||||||
await executeQuery({ connection, systemConnection, driver, sql });
|
await executeQuery({ connection, systemConnection, driver, sql });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
const { splitQuery } = require('dbgate-query-splitter');
|
|
||||||
const requireEngineDriver = require('../utility/requireEngineDriver');
|
const requireEngineDriver = require('../utility/requireEngineDriver');
|
||||||
const connectUtility = require('../utility/connectUtility');
|
const connectUtility = require('../utility/connectUtility');
|
||||||
|
|
||||||
@@ -9,12 +8,7 @@ async function executeQuery({ connection = undefined, systemConnection = undefin
|
|||||||
const pool = systemConnection || (await connectUtility(driver, connection));
|
const pool = systemConnection || (await connectUtility(driver, connection));
|
||||||
console.log(`Connected.`);
|
console.log(`Connected.`);
|
||||||
|
|
||||||
for (const sqlItem of splitQuery(sql, driver.getQuerySplitterOptions('script'))) {
|
await driver.script(pool, sql);
|
||||||
console.log('Executing query', sqlItem);
|
|
||||||
await driver.query(pool, sqlItem, { discardResult: true });
|
|
||||||
}
|
|
||||||
|
|
||||||
console.log(`Query finished`);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = executeQuery;
|
module.exports = executeQuery;
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ const {
|
|||||||
generateDbPairingId,
|
generateDbPairingId,
|
||||||
matchPairedObjects,
|
matchPairedObjects,
|
||||||
databaseInfoFromYamlModel,
|
databaseInfoFromYamlModel,
|
||||||
|
extendDatabaseInfo,
|
||||||
} = require('dbgate-tools');
|
} = require('dbgate-tools');
|
||||||
const importDbModel = require('../utility/importDbModel');
|
const importDbModel = require('../utility/importDbModel');
|
||||||
const requireEngineDriver = require('../utility/requireEngineDriver');
|
const requireEngineDriver = require('../utility/requireEngineDriver');
|
||||||
@@ -23,9 +24,9 @@ async function generateDeploySql({
|
|||||||
}
|
}
|
||||||
|
|
||||||
const deployedModel = generateDbPairingId(
|
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 currentModelPaired = matchPairedObjects(deployedModel, currentModel);
|
||||||
const { sql } = getAlterDatabaseScript(currentModelPaired, deployedModel, {}, deployedModel, driver);
|
const { sql } = getAlterDatabaseScript(currentModelPaired, deployedModel, {}, deployedModel, driver);
|
||||||
return sql;
|
return sql;
|
||||||
|
|||||||
@@ -36,16 +36,19 @@ export class DatabaseInfoAlterProcessor {
|
|||||||
|
|
||||||
createColumn(column: ColumnInfo) {
|
createColumn(column: ColumnInfo) {
|
||||||
const table = this.db.tables.find(x => x.pureName == column.pureName && x.schemaName == column.schemaName);
|
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);
|
table.columns.push(column);
|
||||||
}
|
}
|
||||||
|
|
||||||
changeColumn(oldColumn: ColumnInfo, newColumn: ColumnInfo) {
|
changeColumn(oldColumn: ColumnInfo, newColumn: ColumnInfo) {
|
||||||
const table = this.db.tables.find(x => x.pureName == oldColumn.pureName && x.schemaName == oldColumn.schemaName);
|
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));
|
table.columns = table.columns.map(x => (x.columnName == oldColumn.columnName ? newColumn : x));
|
||||||
}
|
}
|
||||||
|
|
||||||
dropColumn(column: ColumnInfo) {
|
dropColumn(column: ColumnInfo) {
|
||||||
const table = this.db.tables.find(x => x.pureName == column.pureName && x.schemaName == column.schemaName);
|
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);
|
_.remove(table.columns, x => x.columnName == column.columnName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -11,7 +11,6 @@ import _ from 'lodash';
|
|||||||
import uuidv1 from 'uuid/v1';
|
import uuidv1 from 'uuid/v1';
|
||||||
import { AlterPlan } from './alterPlan';
|
import { AlterPlan } from './alterPlan';
|
||||||
import stableStringify from 'json-stable-stringify';
|
import stableStringify from 'json-stable-stringify';
|
||||||
import { isArray } from 'lodash';
|
|
||||||
|
|
||||||
type DbDiffSchemaMode = 'strict' | 'ignore' | 'ignoreImplicit';
|
type DbDiffSchemaMode = 'strict' | 'ignore' | 'ignoreImplicit';
|
||||||
|
|
||||||
@@ -117,6 +116,9 @@ export function testEqualColumns(
|
|||||||
// return false;
|
// return false;
|
||||||
//}
|
//}
|
||||||
if (a.computedExpression != b.computedExpression) {
|
if (a.computedExpression != b.computedExpression) {
|
||||||
|
console.debug(
|
||||||
|
`Column ${a.columnName}, ${b.columnName}: different computed expression: ${a.computedExpression}, ${b.computedExpression}`
|
||||||
|
);
|
||||||
// opts.DiffLogger.Trace(
|
// opts.DiffLogger.Trace(
|
||||||
// 'Column {0}, {1}: different computed expression: {2}; {3}',
|
// 'Column {0}, {1}: different computed expression: {2}; {3}',
|
||||||
// a,
|
// a,
|
||||||
@@ -132,6 +134,10 @@ export function testEqualColumns(
|
|||||||
if (checkDefault) {
|
if (checkDefault) {
|
||||||
if (a.defaultValue == null) {
|
if (a.defaultValue == null) {
|
||||||
if (a.defaultValue != b.defaultValue) {
|
if (a.defaultValue != b.defaultValue) {
|
||||||
|
console.debug(
|
||||||
|
`Column ${a.columnName}, ${b.columnName}: different default value: ${a.defaultValue}, ${b.defaultValue}`
|
||||||
|
);
|
||||||
|
|
||||||
// opts.DiffLogger.Trace(
|
// opts.DiffLogger.Trace(
|
||||||
// 'Column {0}, {1}: different default values: {2}; {3}',
|
// 'Column {0}, {1}: different default values: {2}; {3}',
|
||||||
// a,
|
// a,
|
||||||
@@ -143,6 +149,10 @@ export function testEqualColumns(
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (a.defaultValue != b.defaultValue) {
|
if (a.defaultValue != b.defaultValue) {
|
||||||
|
console.debug(
|
||||||
|
`Column ${a.columnName}, ${b.columnName}: different default value: ${a.defaultValue}, ${b.defaultValue}`
|
||||||
|
);
|
||||||
|
|
||||||
// opts.DiffLogger.Trace(
|
// opts.DiffLogger.Trace(
|
||||||
// 'Column {0}, {1}: different default values: {2}; {3}',
|
// 'Column {0}, {1}: different default values: {2}; {3}',
|
||||||
// a,
|
// a,
|
||||||
@@ -154,6 +164,10 @@ export function testEqualColumns(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (a.defaultConstraint != b.defaultConstraint) {
|
if (a.defaultConstraint != b.defaultConstraint) {
|
||||||
|
console.debug(
|
||||||
|
`Column ${a.columnName}, ${b.columnName}: different default constraint: ${a.defaultConstraint}, ${b.defaultConstraint}`
|
||||||
|
);
|
||||||
|
|
||||||
// opts.DiffLogger.Trace(
|
// opts.DiffLogger.Trace(
|
||||||
// 'Column {0}, {1}: different default constraint names: {2}; {3}',
|
// 'Column {0}, {1}: different default constraint names: {2}; {3}',
|
||||||
// a,
|
// a,
|
||||||
@@ -164,15 +178,23 @@ export function testEqualColumns(
|
|||||||
return false;
|
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);
|
// opts.DiffLogger.Trace('Column {0}, {1}: different nullable: {2}; {3}', a, b, a.NotNull, b.NotNull);
|
||||||
return false;
|
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);
|
// opts.DiffLogger.Trace('Column {0}, {1}: different autoincrement: {2}; {3}', a, b, a.AutoIncrement, b.AutoIncrement);
|
||||||
return false;
|
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);
|
// opts.DiffLogger.Trace('Column {0}, {1}: different is_sparse: {2}; {3}', a, b, a.IsSparse, b.IsSparse);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -215,6 +237,8 @@ function testEqualConstraints(a: ConstraintInfo, b: ConstraintInfo, opts: DbDiff
|
|||||||
|
|
||||||
export function testEqualTypes(a: ColumnInfo, b: ColumnInfo, opts: DbDiffOptions = {}) {
|
export function testEqualTypes(a: ColumnInfo, b: ColumnInfo, opts: DbDiffOptions = {}) {
|
||||||
if (a.dataType != b.dataType) {
|
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);
|
// opts.DiffLogger.Trace("Column {0}, {1}: different types: {2}; {3}", a, b, a.DataType, b.DataType);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user