drawDB/src/utils/exportSQL/sqlite.js
2024-08-03 14:22:56 +03:00

60 lines
2.0 KiB
JavaScript

import { exportFieldComment, parseDefault } from "./shared";
import { dbToTypes } from "../../data/datatypes";
export function toSqlite(diagram) {
return diagram.tables
.map((table) => {
const inlineFK = getInlineFK(table, diagram);
return `${
table.comment === "" ? "" : `/* ${table.comment} */\n`
}CREATE TABLE IF NOT EXISTS "${table.name}" (\n${table.fields
.map(
(field) =>
`${exportFieldComment(field.comment)}\t"${
field.name
}" ${field.type}${field.notNull ? " NOT NULL" : ""}${
field.unique ? " UNIQUE" : ""
}${field.default !== "" ? ` DEFAULT ${parseDefault(field, diagram.database)}` : ""}${
field.check === "" ||
!dbToTypes[diagram.database][field.type].hasCheck
? ""
: ` CHECK(${field.check})`
}`,
)
.join(",\n")}${
table.fields.filter((f) => f.primary).length > 0
? `,\n\tPRIMARY KEY(${table.fields
.filter((f) => f.primary)
.map((f) => `"${f.name}"`)
.join(", ")})${inlineFK !== "" ? ",\n" : ""}`
: ""
}\t${inlineFK}\n);\n${table.indices
.map(
(i) =>
`\nCREATE ${i.unique ? "UNIQUE " : ""}INDEX IF NOT EXISTS "${
i.name
}"\nON "${table.name}" (${i.fields
.map((f) => `"${f}"`)
.join(", ")});`,
)
.join("\n")}`;
})
.join("\n");
}
export function getInlineFK(table, obj) {
let fk = "";
obj.references.forEach((r) => {
if (fk !== "") return;
if (r.startTableId === table.id) {
fk = `FOREIGN KEY ("${table.fields[r.startFieldId].name}") REFERENCES "${
obj.tables[r.endTableId].name
}"("${
obj.tables[r.endTableId].fields[r.endFieldId].name
}")\n\tON UPDATE ${r.updateConstraint.toUpperCase()} ON DELETE ${r.deleteConstraint.toUpperCase()}`;
}
});
return fk;
}