mirror of
https://github.com/drawdb-io/drawdb.git
synced 2025-07-18 10:11:24 +00:00
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:
@@ -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();
|
||||||
|
@@ -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));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user