Fix mysql decimal and dbml enum export (#499)

* Fix decimal and dbml enum export

* Remove map
This commit is contained in:
1ilit
2025-06-21 21:51:50 +04:00
committed by GitHub
parent 3cdf908ffd
commit 9fc9d573e9
3 changed files with 35 additions and 4 deletions

View File

@@ -1070,6 +1070,7 @@ export default function ControlPanel({
tables, tables,
relationships, relationships,
enums, enums,
database,
}); });
setExportData((prev) => ({ setExportData((prev) => ({
...prev, ...prev,

View File

@@ -1,4 +1,5 @@
import { Cardinality } from "../../data/constants"; import { Cardinality } from "../../data/constants";
import { dbToTypes } from "../../data/datatypes";
import i18n from "../../i18n/i18n"; import i18n from "../../i18n/i18n";
import { escapeQuotes, parseDefault } from "../exportSQL/shared"; import { escapeQuotes, parseDefault } from "../exportSQL/shared";
@@ -51,6 +52,15 @@ function cardinality(rel) {
} }
} }
function fieldSize(field, database) {
const typeMetadata = dbToTypes[database][field.type];
if ((typeMetadata.isSized || typeMetadata.hasPrecision) && field.size)
return `(${field.size})`;
return "";
}
export function toDBML(diagram) { export function toDBML(diagram) {
const generateRelString = (rel) => { const generateRelString = (rel) => {
const { fields: startTableFields, name: startTableName } = const { fields: startTableFields, name: startTableName } =
@@ -68,21 +78,38 @@ export function toDBML(diagram) {
return `Ref ${rel.name} {\n\t${startTableName}.${startFieldName} ${cardinality(rel)} ${endTableName}.${endFieldName} [ delete: ${rel.deleteConstraint.toLowerCase()}, update: ${rel.updateConstraint.toLowerCase()} ]\n}`; return `Ref ${rel.name} {\n\t${startTableName}.${startFieldName} ${cardinality(rel)} ${endTableName}.${endFieldName} [ delete: ${rel.deleteConstraint.toLowerCase()}, update: ${rel.updateConstraint.toLowerCase()} ]\n}`;
}; };
let enumDefinitions = "";
for (const table of diagram.tables) {
for (const field of table.fields) {
if (
(field.type === "ENUM" || field.type === "SET") &&
Array.isArray(field.values)
) {
enumDefinitions += `enum ${field.name}_${field.values.join("_")}_t {\n\t${field.values.join("\n\t")}\n}\n\n`;
}
}
}
return `${diagram.enums return `${diagram.enums
.map( .map(
(en) => (en) =>
`enum ${en.name} {\n${en.values.map((v) => `\t${v}`).join("\n")}\n}\n\n`, `enum ${en.name} {\n${en.values.map((v) => `\t${v}`).join("\n")}\n}\n\n`,
) )
.join("\n\n")}${diagram.tables .join("\n\n")}${enumDefinitions}${diagram.tables
.map( .map(
(table) => (table) =>
`Table ${table.name} {\n${table.fields `Table ${table.name} {\n${table.fields
.map( .map(
(field) => (field) =>
`\t${field.name} ${field.type.toLowerCase()}${columnSettings( `\t${field.name} ${
field.type === "ENUM" || field.type === "SET"
? `${field.name}_${field.values.join("_")}_t`
: field.type.toLowerCase()
}${fieldSize(
field, field,
diagram.database, diagram.database,
)}`, )}${columnSettings(field, diagram.database)}`,
) )
.join("\n")}${ .join("\n")}${
table.indices.length > 0 table.indices.length > 0

View File

@@ -10,7 +10,10 @@ function parseType(field) {
res += `${field.values ? "(" + field.values.map((value) => "'" + value + "'").join(", ") + ")" : ""}`; res += `${field.values ? "(" + field.values.map((value) => "'" + value + "'").join(", ") + ")" : ""}`;
} }
if (dbToTypes[DB.MYSQL][field.type].isSized) { if (
dbToTypes[DB.MYSQL][field.type].isSized ||
dbToTypes[DB.MYSQL][field.type].hasPrecision
) {
res += `${field.size && field.size !== "" ? "(" + field.size + ")" : ""}`; res += `${field.size && field.size !== "" ? "(" + field.size + ")" : ""}`;
} }