Fix postgres import when alter expr isnt iterable (#495)

* Fix postgres import when alter expr isnt interable

* Remove hardcoded constants

* Fix type export and import
This commit is contained in:
1ilit
2025-06-14 18:48:57 +04:00
committed by GitHub
parent b974a7d854
commit 7ca34d87b0
2 changed files with 81 additions and 69 deletions

View File

@@ -85,7 +85,7 @@ export function getTypeString(
if (field.type === "DATETIME") { if (field.type === "DATETIME") {
return `timestamp`; return `timestamp`;
} }
if (dbToTypes[currentDb][field.type].isSized) { if (dbToTypes[currentDb][field.type].isSized && field.size) {
const type = const type =
field.type === "BINARY" field.type === "BINARY"
? "bit" ? "bit"
@@ -94,7 +94,11 @@ export function getTypeString(
: field.type.toLowerCase(); : field.type.toLowerCase();
return `${type}(${field.size})`; return `${type}(${field.size})`;
} }
if (dbToTypes[currentDb][field.type].hasPrecision && field.size !== "") { if (
dbToTypes[currentDb][field.type].hasPrecision &&
field.size &&
field.size.trim() !== ""
) {
return `${field.type.toLowerCase()}${field.size ? `(${field.size})` : ""}`; return `${field.type.toLowerCase()}${field.size ? `(${field.size})` : ""}`;
} }
return field.type.toLowerCase(); return field.type.toLowerCase();

View File

@@ -1,5 +1,5 @@
import { nanoid } from "nanoid"; import { nanoid } from "nanoid";
import { Cardinality, DB } from "../../data/constants"; import { Cardinality, Constraint, DB } from "../../data/constants";
import { dbToTypes } from "../../data/datatypes"; import { dbToTypes } from "../../data/datatypes";
import { buildSQLFromAST } from "./shared"; import { buildSQLFromAST } from "./shared";
@@ -13,6 +13,7 @@ const affinity = {
INTEGER: "INT", INTEGER: "INT",
MEDIUMINT: "INTEGER", MEDIUMINT: "INTEGER",
BIT: "BOOLEAN", BIT: "BOOLEAN",
"CHATACTER VARYING": "VARCHAR",
}, },
{ get: (target, prop) => (prop in target ? target[prop] : "BLOB") }, { get: (target, prop) => (prop in target ? target[prop] : "BLOB") },
), ),
@@ -50,8 +51,11 @@ export function fromPostgres(ast, diagramDb = DB.GENERIC) {
d.definition.dataType, d.definition.dataType,
), ),
)?.name; )?.name;
if (!type && !dbToTypes[diagramDb][d.definition.dataType])
type = affinity[diagramDb][d.definition.dataType.toUpperCase()]; type ??=
dbToTypes[diagramDb][d.definition.dataType.toUpperCase()].type;
type ??= affinity[diagramDb][d.definition.dataType.toUpperCase()];
field.type = type; field.type = type;
if (d.definition.expr && d.definition.expr.type === "expr_list") { if (d.definition.expr && d.definition.expr.type === "expr_list") {
@@ -144,8 +148,8 @@ export function fromPostgres(ast, diagramDb = DB.GENERIC) {
relationship.endTableId = endTable.id; relationship.endTableId = endTable.id;
relationship.endFieldId = endField.id; relationship.endFieldId = endField.id;
relationship.startFieldId = startField.id; relationship.startFieldId = startField.id;
let updateConstraint = "No action"; let updateConstraint = Constraint.NONE;
let deleteConstraint = "No action"; let deleteConstraint = Constraint.NONE;
d.reference_definition.on_action.forEach((c) => { d.reference_definition.on_action.forEach((c) => {
if (c.type === "on update") { if (c.type === "on update") {
updateConstraint = c.value.value; updateConstraint = c.value.value;
@@ -178,8 +182,8 @@ export function fromPostgres(ast, diagramDb = DB.GENERIC) {
const endTableName = d.reference_definition.table[0].table; const endTableName = d.reference_definition.table[0].table;
const endFieldName = const endFieldName =
d.reference_definition.definition[0].column.expr.value; d.reference_definition.definition[0].column.expr.value;
let updateConstraint = "No action"; let updateConstraint = Constraint.NONE;
let deleteConstraint = "No action"; let deleteConstraint = Constraint.NONE;
d.reference_definition.on_action.forEach((c) => { d.reference_definition.on_action.forEach((c) => {
if (c.type === "on update") { if (c.type === "on update") {
updateConstraint = c.value.value; updateConstraint = c.value.value;
@@ -281,73 +285,77 @@ export function fromPostgres(ast, diagramDb = DB.GENERIC) {
} }
} }
} else if (e.type === "alter") { } else if (e.type === "alter") {
e.expr.forEach((expr) => { if (Array.isArray(e.expr)) {
if ( e.expr.forEach((expr) => {
expr.action === "add" && if (
expr.create_definitions.constraint_type.toLowerCase() === expr.action === "add" &&
"foreign key" expr.create_definitions.constraint_type.toLowerCase() ===
) { "foreign key"
const relationship = {}; ) {
const startTableName = e.table[0].table; const relationship = {};
const startFieldName = const startTableName = e.table[0].table;
expr.create_definitions.definition[0].column.expr.value; const startFieldName =
const endTableName = expr.create_definitions.definition[0].column.expr.value;
expr.create_definitions.reference_definition.table[0].table; const endTableName =
const endFieldName = expr.create_definitions.reference_definition.table[0].table;
expr.create_definitions.reference_definition.definition[0].column const endFieldName =
.expr.value; expr.create_definitions.reference_definition.definition[0].column
let updateConstraint = "No action"; .expr.value;
let deleteConstraint = "No action"; let updateConstraint = Constraint.NONE;
expr.create_definitions.reference_definition.on_action.forEach( let deleteConstraint = Constraint.NONE;
(c) => { expr.create_definitions.reference_definition.on_action.forEach(
if (c.type === "on update") { (c) => {
updateConstraint = c.value.value; if (c.type === "on update") {
updateConstraint = updateConstraint = c.value.value;
updateConstraint[0].toUpperCase() + updateConstraint =
updateConstraint.substring(1); updateConstraint[0].toUpperCase() +
} else if (c.type === "on delete") { updateConstraint.substring(1);
deleteConstraint = c.value.value; } else if (c.type === "on delete") {
deleteConstraint = deleteConstraint = c.value.value;
deleteConstraint[0].toUpperCase() + deleteConstraint =
deleteConstraint.substring(1); deleteConstraint[0].toUpperCase() +
} deleteConstraint.substring(1);
}, }
); },
);
const startTable = tables.find((t) => t.name === startTableName); const startTable = tables.find((t) => t.name === startTableName);
if (!startTable) return; if (!startTable) return;
const endTable = tables.find((t) => t.name === endTableName); const endTable = tables.find((t) => t.name === endTableName);
if (!endTable) return; if (!endTable) return;
const endField = endTable.fields.find((f) => f.name === endFieldName); const endField = endTable.fields.find(
if (!endField) return; (f) => f.name === endFieldName,
);
if (!endField) return;
const startField = startTable.fields.find( const startField = startTable.fields.find(
(f) => f.name === startFieldName, (f) => f.name === startFieldName,
); );
if (!startField) return; if (!startField) return;
relationship.name = `fk_${startTableName}_${startFieldName}_${endTableName}`; relationship.name = `fk_${startTableName}_${startFieldName}_${endTableName}`;
relationship.startTableId = startTable.id; relationship.startTableId = startTable.id;
relationship.startFieldId = startField.id; relationship.startFieldId = startField.id;
relationship.endTableId = endTable.id; relationship.endTableId = endTable.id;
relationship.endFieldId = endField.id; relationship.endFieldId = endField.id;
relationship.updateConstraint = updateConstraint; relationship.updateConstraint = updateConstraint;
relationship.deleteConstraint = deleteConstraint; relationship.deleteConstraint = deleteConstraint;
relationship.cardinality = Cardinality.ONE_TO_ONE;
if (startField.unique) {
relationship.cardinality = Cardinality.ONE_TO_ONE; relationship.cardinality = Cardinality.ONE_TO_ONE;
} else {
relationship.cardinality = Cardinality.MANY_TO_ONE; if (startField.unique) {
relationship.cardinality = Cardinality.ONE_TO_ONE;
} else {
relationship.cardinality = Cardinality.MANY_TO_ONE;
}
relationships.push(relationship);
relationships.forEach((r, i) => (r.id = i));
} }
});
relationships.push(relationship); }
relationships.forEach((r, i) => (r.id = i));
}
});
} }
}; };