UNPKG

pg-mermaid

Version:

Mermaid diagram generator for PostgreSQL database schema

118 lines 4.83 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getIndexes = exports.getRelationships = exports.getEntities = exports.createConnection = void 0; const tslib_1 = require("tslib"); const types_1 = require("./types"); const slonik_1 = require("slonik"); const createConnection = ({ dbname, host = '127.0.0.1', password, port = 5432, username, }) => tslib_1.__awaiter(void 0, void 0, void 0, function* () { return (0, slonik_1.createPool)(`postgres://${username}:${password}@${host}:${port}/${dbname}`); }); exports.createConnection = createConnection; const getEntities = ({ excludedTables = [], schema = 'public', } = {}) => slonik_1.sql.type(types_1.EntitySchema) ` select columns.table_name as name, json_agg( json_build_object( 'comment', case when columns.is_nullable = 'YES' then 'null' when columns.is_nullable = 'NO' then 'not null' end, 'key', case when table_constraints.constraint_type = 'PRIMARY KEY' then 'PK' when table_constraints.constraint_type = 'FOREIGN KEY' then 'FK' end, 'name', columns.column_name, 'type', case when columns.data_type = 'ARRAY' then concat(regexp_replace(columns.udt_name, '^_', ''), '[]') when columns.data_type = 'USER-DEFINED' then columns.udt_name else replace(columns.data_type, ' ', '_') end ) order by case when table_constraints.constraint_type = 'PRIMARY KEY' then 1 when table_constraints.constraint_type = 'FOREIGN KEY' then 2 else 3 end, columns.is_nullable, case when columns.data_type = 'ARRAY' then concat(regexp_replace(columns.udt_name, '^_', ''), '[]') when columns.data_type = 'USER-DEFINED' then columns.udt_name else columns.data_type end, columns.column_name ) as attributes from information_schema.columns left join information_schema.key_column_usage on key_column_usage.table_schema = columns.table_schema and key_column_usage.table_name = columns.table_name and key_column_usage.column_name = columns.column_name left join information_schema.table_constraints on table_constraints.table_schema = key_column_usage.table_schema and table_constraints.table_name = key_column_usage.table_name and table_constraints.constraint_name = key_column_usage.constraint_name where columns.table_schema = ${schema} and columns.table_name != all(${slonik_1.sql.array(excludedTables, 'text')}) group by name order by name; `; exports.getEntities = getEntities; const getRelationships = ({ excludedTables = [], schema = 'public', } = {}) => slonik_1.sql.type(types_1.RelationshipSchema) ` select json_build_object( 'entity', child_key_column_usage.table_name, 'attributes', json_agg(distinct child_key_column_usage.column_name) ) as child, json_build_object( 'entity', parent_key_column_usage.table_name, 'attributes', json_agg(distinct parent_key_column_usage.column_name) ) as parent from information_schema.referential_constraints join information_schema.key_column_usage as child_key_column_usage on child_key_column_usage.constraint_schema = referential_constraints.constraint_schema and child_key_column_usage.constraint_name = referential_constraints.constraint_name and child_key_column_usage.table_name != all(${slonik_1.sql.array(excludedTables, 'text')}) join information_schema.key_column_usage as parent_key_column_usage on parent_key_column_usage.constraint_schema = referential_constraints.unique_constraint_schema and parent_key_column_usage.constraint_name = referential_constraints.unique_constraint_name and parent_key_column_usage.table_name != all(${slonik_1.sql.array(excludedTables, 'text')}) where referential_constraints.constraint_schema = ${schema} group by child_key_column_usage.constraint_name, child_key_column_usage.table_name, parent_key_column_usage.table_name order by parent_key_column_usage.table_name, child_key_column_usage.table_name; `; exports.getRelationships = getRelationships; const getIndexes = ({ excludedTables = [], schema = 'public', } = {}) => slonik_1.sql.type(types_1.TableIndexesSchema) ` select tablename as name, json_agg(indexname order by indexname) as indexes from pg_indexes where schemaname = ${schema} and tablename != all(${slonik_1.sql.array(excludedTables, 'text')}) group by tablename order by tablename; `; exports.getIndexes = getIndexes; //# sourceMappingURL=database.js.map