mirror of
https://github.com/DeNNiiInc/dbgate.git
synced 2026-04-21 02:25:59 +00:00
import models tests fixed
This commit is contained in:
@@ -182,7 +182,7 @@ describe('DB Import/export', () => {
|
|||||||
})
|
})
|
||||||
);
|
);
|
||||||
|
|
||||||
test.each(engines.map(engine => [engine.label, engine]))(
|
test.each(engines.filter(engine => !engine.skipImportModel).map(engine => [engine.label, engine]))(
|
||||||
'Import guitar shop - schema + data - %s',
|
'Import guitar shop - schema + data - %s',
|
||||||
testWrapper(async (conn, driver, engine) => {
|
testWrapper(async (conn, driver, engine) => {
|
||||||
await importDbFromFolder({
|
await importDbFromFolder({
|
||||||
|
|||||||
@@ -539,6 +539,7 @@ const clickhouseEngine = {
|
|||||||
alterTableAddColumnSyntax: true,
|
alterTableAddColumnSyntax: true,
|
||||||
dbSnapshotBySeconds: true,
|
dbSnapshotBySeconds: true,
|
||||||
skipChangeColumn: true,
|
skipChangeColumn: true,
|
||||||
|
skipImportModel: true,
|
||||||
};
|
};
|
||||||
|
|
||||||
/** @type {import('dbgate-types').TestEngineInfo} */
|
/** @type {import('dbgate-types').TestEngineInfo} */
|
||||||
@@ -627,6 +628,7 @@ const cassandraEngine = {
|
|||||||
skipDataModifications: true,
|
skipDataModifications: true,
|
||||||
skipDataDuplicator: true,
|
skipDataDuplicator: true,
|
||||||
skipDeploy: true,
|
skipDeploy: true,
|
||||||
|
skipImportModel: true,
|
||||||
|
|
||||||
forceSortResults: true,
|
forceSortResults: true,
|
||||||
forceSortStructureColumns: true,
|
forceSortStructureColumns: true,
|
||||||
@@ -657,8 +659,8 @@ const enginesOnLocal = [
|
|||||||
// sqlServerEngine,
|
// sqlServerEngine,
|
||||||
// sqliteEngine,
|
// sqliteEngine,
|
||||||
// cockroachDbEngine,
|
// cockroachDbEngine,
|
||||||
// clickhouseEngine,
|
clickhouseEngine,
|
||||||
oracleEngine,
|
// oracleEngine,
|
||||||
];
|
];
|
||||||
|
|
||||||
/** @type {import('dbgate-types').TestEngineInfo[] & Record<string, import('dbgate-types').TestEngineInfo>} */
|
/** @type {import('dbgate-types').TestEngineInfo[] & Record<string, import('dbgate-types').TestEngineInfo>} */
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ const fs = require('fs-extra');
|
|||||||
const executeQuery = require('./executeQuery');
|
const executeQuery = require('./executeQuery');
|
||||||
const { connectUtility } = require('../utility/connectUtility');
|
const { connectUtility } = require('../utility/connectUtility');
|
||||||
const requireEngineDriver = require('../utility/requireEngineDriver');
|
const requireEngineDriver = require('../utility/requireEngineDriver');
|
||||||
const { getAlterDatabaseScript, DatabaseAnalyser } = require('dbgate-tools');
|
const { getAlterDatabaseScript, DatabaseAnalyser, runCommandOnDriver } = require('dbgate-tools');
|
||||||
const importDbModel = require('../utility/importDbModel');
|
const importDbModel = require('../utility/importDbModel');
|
||||||
const jsonLinesReader = require('./jsonLinesReader');
|
const jsonLinesReader = require('./jsonLinesReader');
|
||||||
const tableWriter = require('./tableWriter');
|
const tableWriter = require('./tableWriter');
|
||||||
@@ -41,17 +41,38 @@ async function importDbFromFolder({ connection, systemConnection, driver, folder
|
|||||||
})),
|
})),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// const plan = createAlterDatabasePlan(
|
||||||
|
// DatabaseAnalyser.createEmptyStructure(),
|
||||||
|
// driver.dialect.enableAllForeignKeys ? modelAdapted : modelNoFk,
|
||||||
|
// {},
|
||||||
|
// DatabaseAnalyser.createEmptyStructure(),
|
||||||
|
// driver.dialect.enableAllForeignKeys ? modelAdapted : modelNoFk,
|
||||||
|
// driver
|
||||||
|
// );
|
||||||
|
// const dmp1 = driver.createDumper({ useHardSeparator: true });
|
||||||
|
// if (driver.dialect.enableAllForeignKeys) {
|
||||||
|
// dmp1.enableAllForeignKeys(false);
|
||||||
|
// }
|
||||||
|
// plan.run(dmp1);
|
||||||
|
// if (driver.dialect.enableAllForeignKeys) {
|
||||||
|
// dmp1.enableAllForeignKeys(true);
|
||||||
|
// }
|
||||||
|
|
||||||
const { sql } = getAlterDatabaseScript(
|
const { sql } = getAlterDatabaseScript(
|
||||||
DatabaseAnalyser.createEmptyStructure(),
|
DatabaseAnalyser.createEmptyStructure(),
|
||||||
modelNoFk,
|
driver.dialect.enableAllForeignKeys ? modelAdapted : modelNoFk,
|
||||||
{},
|
{},
|
||||||
DatabaseAnalyser.createEmptyStructure(),
|
DatabaseAnalyser.createEmptyStructure(),
|
||||||
modelNoFk,
|
driver.dialect.enableAllForeignKeys ? modelAdapted : modelNoFk,
|
||||||
driver
|
driver
|
||||||
);
|
);
|
||||||
// console.log('CREATING STRUCTURE:', sql);
|
// console.log('CREATING STRUCTURE:', sql);
|
||||||
await executeQuery({ connection, systemConnection: dbhan, driver, sql, logScriptItems: true });
|
await executeQuery({ connection, systemConnection: dbhan, driver, sql, logScriptItems: true });
|
||||||
|
|
||||||
|
if (driver.dialect.enableAllForeignKeys) {
|
||||||
|
await runCommandOnDriver(dbhan, driver, dmp => dmp.enableAllForeignKeys(false));
|
||||||
|
}
|
||||||
|
|
||||||
for (const table of modelAdapted.tables) {
|
for (const table of modelAdapted.tables) {
|
||||||
const fileName = path.join(folder, `${table.pureName}.jsonl`);
|
const fileName = path.join(folder, `${table.pureName}.jsonl`);
|
||||||
if (await fs.exists(fileName)) {
|
if (await fs.exists(fileName)) {
|
||||||
@@ -66,14 +87,19 @@ async function importDbFromFolder({ connection, systemConnection, driver, folder
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const dmp = driver.createDumper();
|
if (driver.dialect.enableAllForeignKeys) {
|
||||||
for (const table of modelAdapted.tables) {
|
await runCommandOnDriver(dbhan, driver, dmp => dmp.enableAllForeignKeys(true));
|
||||||
for (const fk of table.foreignKeys) {
|
} else if (driver.dialect.createForeignKey) {
|
||||||
dmp.createForeignKey(fk);
|
const dmp = driver.createDumper();
|
||||||
|
for (const table of modelAdapted.tables) {
|
||||||
|
for (const fk of table.foreignKeys) {
|
||||||
|
dmp.createForeignKey(fk);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// create foreign keys
|
||||||
|
await executeQuery({ connection, systemConnection: dbhan, driver, sql: dmp.s, logScriptItems: true });
|
||||||
}
|
}
|
||||||
// create foreign keys
|
|
||||||
await executeQuery({ connection, systemConnection: dbhan, driver, sql: dmp.s, logScriptItems: true });
|
|
||||||
} finally {
|
} finally {
|
||||||
if (!systemConnection) {
|
if (!systemConnection) {
|
||||||
await driver.close(dbhan);
|
await driver.close(dbhan);
|
||||||
|
|||||||
@@ -350,7 +350,9 @@ export class SqlDumper implements AlterProcessor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
createForeignKeyFore(fk: ForeignKeyInfo) {
|
createForeignKeyFore(fk: ForeignKeyInfo) {
|
||||||
if (fk.constraintName != null) this.put('^constraint %i ', fk.constraintName);
|
if (fk.constraintName != null && !this.dialect.anonymousForeignKey) {
|
||||||
|
this.put('^constraint %i ', fk.constraintName);
|
||||||
|
}
|
||||||
this.put(
|
this.put(
|
||||||
'^foreign ^key (%,i) ^references %f (%,i)',
|
'^foreign ^key (%,i) ^references %f (%,i)',
|
||||||
fk.columns.map(x => x.columnName),
|
fk.columns.map(x => x.columnName),
|
||||||
@@ -367,6 +369,7 @@ export class SqlDumper implements AlterProcessor {
|
|||||||
|
|
||||||
allowIdentityInsert(table: NamedObjectInfo, allow: boolean) {}
|
allowIdentityInsert(table: NamedObjectInfo, allow: boolean) {}
|
||||||
enableConstraints(table: NamedObjectInfo, enabled: boolean) {}
|
enableConstraints(table: NamedObjectInfo, enabled: boolean) {}
|
||||||
|
enableAllForeignKeys(enabled: boolean) {}
|
||||||
|
|
||||||
comment(value: string) {
|
comment(value: string) {
|
||||||
if (!value) return;
|
if (!value) return;
|
||||||
|
|||||||
2
packages/types/dialect.d.ts
vendored
2
packages/types/dialect.d.ts
vendored
@@ -13,8 +13,10 @@ export interface SqlDialect {
|
|||||||
fallbackDataType?: string;
|
fallbackDataType?: string;
|
||||||
explicitDropConstraint?: boolean;
|
explicitDropConstraint?: boolean;
|
||||||
anonymousPrimaryKey?: boolean;
|
anonymousPrimaryKey?: boolean;
|
||||||
|
anonymousForeignKey?: boolean;
|
||||||
defaultSchemaName?: string;
|
defaultSchemaName?: string;
|
||||||
enableConstraintsPerTable?: boolean;
|
enableConstraintsPerTable?: boolean;
|
||||||
|
enableAllForeignKeys?: boolean;
|
||||||
requireStandaloneSelectForScopeIdentity?: boolean;
|
requireStandaloneSelectForScopeIdentity?: boolean;
|
||||||
allowMultipleValuesInsert?: boolean;
|
allowMultipleValuesInsert?: boolean;
|
||||||
|
|
||||||
|
|||||||
1
packages/types/test-engines.d.ts
vendored
1
packages/types/test-engines.d.ts
vendored
@@ -39,6 +39,7 @@ export type TestEngineInfo = {
|
|||||||
skipNonPkRename?: boolean;
|
skipNonPkRename?: boolean;
|
||||||
skipPkDrop?: boolean;
|
skipPkDrop?: boolean;
|
||||||
skipOrderBy?: boolean;
|
skipOrderBy?: boolean;
|
||||||
|
skipImportModel?: boolean;
|
||||||
|
|
||||||
forceSortResults?: boolean;
|
forceSortResults?: boolean;
|
||||||
forceSortStructureColumns?: boolean;
|
forceSortStructureColumns?: boolean;
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
const { SqlDumper } = global.DBGATE_PACKAGES['dbgate-tools'];
|
const { SqlDumper } = global.DBGATE_PACKAGES['dbgate-tools'];
|
||||||
|
|
||||||
const numericDataTypes = ['tinyint', 'smallint', 'int', 'bigint', 'varint', 'float', 'double', 'decimal'];
|
const numericDataTypes = ['tinyint', 'smallint', 'int', 'bigint', 'varint', 'float', 'double', 'decimal'];
|
||||||
|
const stringDataTypes = ['text', 'varchar'];
|
||||||
|
|
||||||
class Dumper extends SqlDumper {
|
class Dumper extends SqlDumper {
|
||||||
/**
|
/**
|
||||||
@@ -64,7 +65,12 @@ class Dumper extends SqlDumper {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (numericDataTypes.includes(dataType?.toLowerCase()) && !Number.isNaN(parseFloat(value))) {
|
if (numericDataTypes.includes(dataType?.toLowerCase()) && !Number.isNaN(parseFloat(value))) {
|
||||||
this.putRaw(value);
|
this.putRaw(parseFloat(value));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (stringDataTypes.includes(dataType?.toLowerCase())) {
|
||||||
|
super.putValue(value?.toString());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -36,6 +36,10 @@ class Dumper extends SqlDumper {
|
|||||||
}
|
}
|
||||||
super.createTablePrimaryKeyCore(table);
|
super.createTablePrimaryKeyCore(table);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enableAllForeignKeys(enabled) {
|
||||||
|
this.putCmd('^pragma ^foreign_keys = %s', enabled ? 'on' : 'off');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = Dumper;
|
module.exports = Dumper;
|
||||||
|
|||||||
@@ -30,11 +30,13 @@ const dialect = {
|
|||||||
createIndex: true,
|
createIndex: true,
|
||||||
dropIndex: true,
|
dropIndex: true,
|
||||||
createForeignKey: false,
|
createForeignKey: false,
|
||||||
|
enableForeignKeyChecks: false,
|
||||||
dropForeignKey: false,
|
dropForeignKey: false,
|
||||||
createPrimaryKey: false,
|
createPrimaryKey: false,
|
||||||
dropPrimaryKey: false,
|
dropPrimaryKey: false,
|
||||||
dropReferencesWhenDropTable: false,
|
dropReferencesWhenDropTable: false,
|
||||||
filteredIndexes: true,
|
filteredIndexes: true,
|
||||||
|
anonymousForeignKey: true,
|
||||||
};
|
};
|
||||||
|
|
||||||
/** @type {import('dbgate-types').EngineDriver} */
|
/** @type {import('dbgate-types').EngineDriver} */
|
||||||
|
|||||||
Reference in New Issue
Block a user