diff --git a/lib/dbms.js b/lib/dbms.js index 9bf7085..0b1c0af 100644 --- a/lib/dbms.js +++ b/lib/dbms.js @@ -51,6 +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 delayedKeys = {}; + for (const key of model.order) { + delayedKeys[key] = null; + } const script = []; const ins = []; const upd = []; @@ -58,13 +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), ''); + script.push(createEntity(model, name, delayedKeys), ''); if (model.entities.get('Identifier')) { const { inserts, updates } = registerEntity(model, name); ins.push(inserts); upd.push(updates); } } + 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 2af7051..3f57740 100644 --- a/lib/pg.js +++ b/lib/pg.js @@ -138,7 +138,7 @@ const flatFields = (fields) => { return flat; }; -const createEntity = (model, name) => { +const createEntity = (model, name, delayedKeys = {}) => { const entity = model.entities.get(name); const sql = []; const idx = []; @@ -183,7 +183,12 @@ const createEntity = (model, name) => { const ref = model.entities.get(def.type); if (!ref) throw new Error(`Unknown schema: ${def.type}`); const refId = ref.kind === 'registry'; - idx.push(foreignKey(name, field, def, refId)); + const fKey = foreignKey(name, field, def, refId); + if (def.type in delayedKeys && def.type !== name) { + delayedKeys[def.type] = fKey; + } else { + idx.push(fKey); + } } } } @@ -201,6 +206,7 @@ const createEntity = (model, name) => { } sql[sql.length - 1] = sql[sql.length - 1].slice(0, -1); sql.push(');'); + if (delayedKeys[name]) idx.push(delayedKeys[name]); return sql.join('\n') + '\n\n' + idx.join('\n'); };