mirror of
https://github.com/DeNNiiInc/dbgate.git
synced 2026-04-20 15:56:00 +00:00
export model - filter by schema
This commit is contained in:
@@ -13,6 +13,7 @@ const {
|
||||
modelCompareDbDiffOptions,
|
||||
getLogger,
|
||||
extractErrorLogData,
|
||||
filterStructureBySchema,
|
||||
} = require('dbgate-tools');
|
||||
const { html, parse } = require('diff2html');
|
||||
const { handleProcessCommunication } = require('../utility/processComm');
|
||||
@@ -448,7 +449,8 @@ module.exports = {
|
||||
: outputFolder;
|
||||
|
||||
const model = await this.structure({ conid, database });
|
||||
await exportDbModel(extendDatabaseInfo(model), realFolder);
|
||||
const filteredModel = schema ? filterStructureBySchema(model, schema) : model;
|
||||
await exportDbModel(extendDatabaseInfo(filteredModel), realFolder);
|
||||
|
||||
if (outputFolder.startsWith('archive:')) {
|
||||
socket.emitChanged(`archive-files-changed`, { folder: outputFolder.substring('archive:'.length) });
|
||||
@@ -457,14 +459,15 @@ module.exports = {
|
||||
},
|
||||
|
||||
exportModelSql_meta: true,
|
||||
async exportModelSql({ conid, database, outputFolder, outputFile }, req) {
|
||||
async exportModelSql({ conid, database, outputFolder, outputFile, schema }, req) {
|
||||
testConnectionPermission(conid, req);
|
||||
|
||||
const connection = await connections.getCore({ conid });
|
||||
const driver = requireEngineDriver(connection);
|
||||
|
||||
const model = await this.structure({ conid, database });
|
||||
await exportDbModelSql(extendDatabaseInfo(model), driver, outputFolder, outputFile);
|
||||
const filteredModel = schema ? filterStructureBySchema(model, schema) : model;
|
||||
await exportDbModelSql(extendDatabaseInfo(filteredModel), driver, outputFolder, outputFile);
|
||||
|
||||
return { status: 'ok' };
|
||||
},
|
||||
|
||||
@@ -1,11 +1,21 @@
|
||||
const fs = require('fs-extra');
|
||||
const path = require('path');
|
||||
const yaml = require('js-yaml');
|
||||
const { mkdirp } = require('mkdirp');
|
||||
const { getSchemasUsedByStructure } = require('dbgate-tools');
|
||||
|
||||
async function exportDbModelSql(dbModel, driver, outputDir, outputFile) {
|
||||
const { tables, views, procedures, functions, triggers, matviews } = dbModel;
|
||||
|
||||
const usedSchemas = getSchemasUsedByStructure(dbModel);
|
||||
const useSchemaDir = usedSchemas.length > 1;
|
||||
|
||||
const createdDirs = new Set();
|
||||
async function ensureDir(dir) {
|
||||
if (!createdDirs.has(dir)) {
|
||||
await fs.mkdir(dir, { recursive: true });
|
||||
createdDirs.add(dir);
|
||||
}
|
||||
}
|
||||
|
||||
async function writeLists(writeList) {
|
||||
await writeList(views, 'views');
|
||||
await writeList(procedures, 'procedures');
|
||||
@@ -39,25 +49,29 @@ async function exportDbModelSql(dbModel, driver, outputDir, outputFile) {
|
||||
}
|
||||
|
||||
if (outputDir) {
|
||||
await mkdirp(path.join(outputDir, 'tables'));
|
||||
for (const table of tables || []) {
|
||||
const tablesDir = useSchemaDir
|
||||
? path.join(outputDir, table.schemaName ?? 'default', 'tables')
|
||||
: path.join(outputDir, 'tables');
|
||||
await ensureDir(tablesDir);
|
||||
const dmp = driver.createDumper();
|
||||
dmp.createTable({
|
||||
...table,
|
||||
foreignKeys: [],
|
||||
dependencies: [],
|
||||
});
|
||||
await fs.writeFile(path.join(outputDir, 'tables', `${table.pureName}.sql`), dmp.s);
|
||||
await fs.writeFile(path.join(tablesDir, `${table.pureName}.sql`), dmp.s);
|
||||
}
|
||||
|
||||
await writeLists(async (list, folder) => {
|
||||
if (list.length > 0) {
|
||||
await mkdirp(path.join(outputDir, folder));
|
||||
}
|
||||
for (const obj of list || []) {
|
||||
const objdir = useSchemaDir
|
||||
? path.join(outputDir, obj.schemaName ?? 'default', folder)
|
||||
: path.join(outputDir, folder);
|
||||
await ensureDir(objdir);
|
||||
const dmp = driver.createDumper();
|
||||
dmp.createSqlObject(obj);
|
||||
await fs.writeFile(path.join(outputDir, folder, `${obj.pureName}.sql`), dmp.s);
|
||||
await fs.writeFile(path.join(objdir, `${obj.pureName}.sql`), dmp.s);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user