import models tests fixed

This commit is contained in:
Jan Prochazka
2025-02-25 13:58:03 +01:00
parent ec02743f83
commit a4d3189dac
9 changed files with 60 additions and 14 deletions

View File

@@ -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({

View File

@@ -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>} */

View File

@@ -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);

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;
} }

View File

@@ -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;

View File

@@ -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} */