From c5fd5f89f00a2c9afe31695ae2590ec8ff2e61c9 Mon Sep 17 00:00:00 2001 From: Dmytro Shyryaiev Date: Thu, 23 May 2024 18:51:21 +0300 Subject: [PATCH] Fixed an error when creating a structure file for Fixed an error when creating structure.sql file for a database, when it is necessary to create a relation for tables that refer to each other. Fixed ussues Metasql https://github.com/metarhia/metasql/issues/291 --- lib/dbms.js | 10 ++++++---- lib/pg.js | 12 +++++++----- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/lib/dbms.js b/lib/dbms.js index 9be501d..0b1c0af 100644 --- a/lib/dbms.js +++ b/lib/dbms.js @@ -51,8 +51,10 @@ const getPreviousVersion = async (modelPath) => { const create = async (modelPath, outputPath = modelPath) => { console.log('Generating SQL DDL script ' + shorten(outputPath)); const model = await loadModel(modelPath); - const modelRemain = {}; - model.order.forEach((value) => (modelRemain[value] = null)); + const delayedKeys = {}; + for (const key of model.order) { + delayedKeys[key] = null; + } const script = []; const ins = []; const upd = []; @@ -60,14 +62,14 @@ const create = async (modelPath, outputPath = modelPath) => { for (const name of model.order) { const entity = model.entities.get(name); if (metaschema.KIND_STORED.includes(entity.kind)) { - script.push(createEntity(model, name, modelRemain), ''); + script.push(createEntity(model, name, delayedKeys), ''); if (model.entities.get('Identifier')) { const { inserts, updates } = registerEntity(model, name); ins.push(inserts); upd.push(updates); } } - delete modelRemain[name]; + delete delayedKeys[name]; } if (ins.length) script.push(...ins, '', ...upd, ''); const dbPath = path.join(outputPath, 'database.sql'); diff --git a/lib/pg.js b/lib/pg.js index 707fd81..3f57740 100644 --- a/lib/pg.js +++ b/lib/pg.js @@ -138,7 +138,7 @@ const flatFields = (fields) => { return flat; }; -const createEntity = (model, name, modelRemain = {}) => { +const createEntity = (model, name, delayedKeys = {}) => { const entity = model.entities.get(name); const sql = []; const idx = []; @@ -184,9 +184,11 @@ const createEntity = (model, name, modelRemain = {}) => { if (!ref) throw new Error(`Unknown schema: ${def.type}`); const refId = ref.kind === 'registry'; const fKey = foreignKey(name, field, def, refId); - if (def.type in modelRemain && def.type !== name) { - modelRemain[def.type] = fKey; - } else idx.push(fKey); + if (def.type in delayedKeys && def.type !== name) { + delayedKeys[def.type] = fKey; + } else { + idx.push(fKey); + } } } } @@ -204,7 +206,7 @@ const createEntity = (model, name, modelRemain = {}) => { } sql[sql.length - 1] = sql[sql.length - 1].slice(0, -1); sql.push(');'); - if (modelRemain[name]) idx.push(modelRemain[name]); + if (delayedKeys[name]) idx.push(delayedKeys[name]); return sql.join('\n') + '\n\n' + idx.join('\n'); };