UNPKG

@fewer/adapter-postgres

Version:

A Fewer database adapter to connect to Postgres

77 lines 2.88 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const rawQuery_1 = __importDefault(require("./rawQuery")); const TYPE_MAP = { 'double precision': 'double', 'character varying': 'varchar', character: 'char', }; const CHARACTER_TYPE = ['varchar', 'character varying', 'char']; const NUMERIC_TYPE = ['numeric', 'decimal']; function getArgument(config) { const arg = {}; const type = config.data_type.toLowerCase(); if (!config.is_nullable) { arg.nonNull = true; } if (CHARACTER_TYPE.includes(type)) { arg.length = config.character_maximum_length; } if (NUMERIC_TYPE.includes(type)) { arg.precision = config.numeric_precision; arg.scale = config.numeric_scale; } if (Object.keys(arg).length === 0) { return null; } return arg; } // TODO: Extra things like primary key and unique: async function infos(db) { const schema = {}; const tables = await rawQuery_1.default(db, ` SELECT t.table_catalog, t.table_schema, t.table_name, kcu.constraint_name, kcu.column_name, kcu.ordinal_position FROM INFORMATION_SCHEMA.TABLES t LEFT JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc ON tc.table_catalog = t.table_catalog AND tc.table_schema = t.table_schema AND tc.table_name = t.table_name AND tc.constraint_type = 'PRIMARY KEY' LEFT JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE kcu ON kcu.table_catalog = tc.table_catalog AND kcu.table_schema = tc.table_schema AND kcu.table_name = tc.table_name AND kcu.constraint_name = tc.constraint_name WHERE t.table_schema NOT IN ('pg_catalog', 'information_schema') ORDER BY t.table_catalog, t.table_schema, t.table_name, kcu.constraint_name, kcu.ordinal_position;`); // TODO: For compound primary keys, this comes through as multiple tables, we need to handle that. for (const table of tables) { // Skip migration tracking table: if (table.table_name === '_fewer_version') continue; const columns = await rawQuery_1.default(db, `SELECT * FROM information_schema.columns WHERE table_name=$1`, [table.table_name]); schema[table.table_name] = { primaryKey: table.column_name, columns: columns.map(col => ({ name: col.column_name, method: (TYPE_MAP[col.data_type] || col.data_type).toLowerCase(), arguments: [getArgument(col)].filter(Boolean), })), }; } return schema; } exports.default = infos; //# sourceMappingURL=infos.js.map