|
1 | 1 | import { Pool } from 'pg'; |
2 | | -import { getFields, Fields, Column, getColumns, formatColumns, formatPrimaryKey } from './etl-processes'; |
| 2 | +import { getFields, Fields, Column, getColumns, formatColumns, formatPrimaryKey, generatePrimaryKey } from './etl-processes'; |
3 | 3 | import { readExcel } from './excel'; |
4 | 4 |
|
| 5 | +export enum PrimaryKeyOptions { |
| 6 | + GENERATE = 'GENERATE', |
| 7 | + USE_EXISTING = 'USE EXISTING', |
| 8 | + NO_PRIMARY_KEY = 'NO PRIMARY KEY' |
| 9 | +} |
| 10 | + |
5 | 11 | export interface Connection { |
6 | | - user: string; |
7 | | - host: string; |
8 | | - database: string; |
9 | | - password: string; |
10 | | - port: number; |
| 12 | + user: string; |
| 13 | + host: string; |
| 14 | + database: string; |
| 15 | + password: string; |
| 16 | + port: number; |
11 | 17 | } |
12 | 18 |
|
13 | 19 | export interface Options { |
14 | | - createDatabase?: boolean; |
15 | | - createTables?: boolean; |
| 20 | + createDatabase?: boolean; |
| 21 | + createTables?: boolean; |
| 22 | + generatePrimaryKey?: boolean; |
16 | 23 | useExistingPrimaryKeys?: boolean; |
17 | 24 | } |
18 | 25 |
|
19 | 26 | export function createDatabase(dbName: string): string { |
20 | 27 | return `CREATE DATABASE ${dbName};`; |
21 | 28 | } |
22 | 29 |
|
23 | | -export function createTable<T>(tableName: string, data: T, useExistingPrimaryKeys?: boolean): string { |
| 30 | +export function createTable<T>(tableName: string, data: T, primaryKeyOptions: string): string { |
24 | 31 | const fields: Fields<T> = getFields(data); |
25 | 32 | const columns: Column[] = getColumns(fields); |
26 | | - const formattedColumns: string[] = useExistingPrimaryKeys ? formatPrimaryKey(formatColumns(columns)) : formatColumns(columns).formattedColumns; |
| 33 | + |
| 34 | + let formattedColumns: string[] = []; |
| 35 | + |
| 36 | + if (primaryKeyOptions === PrimaryKeyOptions.GENERATE) { |
| 37 | + formattedColumns = generatePrimaryKey(formatColumns(columns));; |
| 38 | + } else if (primaryKeyOptions === PrimaryKeyOptions.USE_EXISTING) { |
| 39 | + formattedColumns = formatPrimaryKey(formatColumns(columns)); |
| 40 | + } else if (primaryKeyOptions === PrimaryKeyOptions.NO_PRIMARY_KEY) { |
| 41 | + formattedColumns = formatColumns(columns).formattedColumns; |
| 42 | + } else { |
| 43 | + return; |
| 44 | + } |
27 | 45 |
|
28 | 46 | return `CREATE TABLE ${tableName.replace(/\s/g, '')} ( |
29 | 47 | ${formattedColumns} |
@@ -71,14 +89,29 @@ async function executeQuery(connectionInfo: Connection, query: string) { |
71 | 89 | await pool.end(); |
72 | 90 | } |
73 | 91 |
|
| 92 | +export function handlePrimaryKey(options: Options): string { |
| 93 | + if (options.generatePrimaryKey) { |
| 94 | + return PrimaryKeyOptions.GENERATE; |
| 95 | + } else if (options.useExistingPrimaryKeys) { |
| 96 | + return PrimaryKeyOptions.USE_EXISTING; |
| 97 | + } else { |
| 98 | + return PrimaryKeyOptions.NO_PRIMARY_KEY; |
| 99 | + } |
| 100 | +} |
| 101 | + |
74 | 102 | export async function excelToPostgresDb(connectionInfo: Connection, filePath: string, options?: Options): Promise<void> { |
| 103 | + |
| 104 | + if (options?.generatePrimaryKey && options?.useExistingPrimaryKeys) { |
| 105 | + return console.error('Cannot generate primary keys column and also use existing primary keys'); |
| 106 | + } |
| 107 | + |
75 | 108 | const sheets = readExcel(filePath); |
76 | 109 |
|
77 | 110 | let insertQuery = ''; |
78 | 111 | let tableQuery = ''; |
79 | | - |
| 112 | + |
80 | 113 | sheets.forEach(async (sheet) => { |
81 | | - tableQuery = tableQuery.concat(createTable(sheet.title, sheet.data[0], options?.useExistingPrimaryKeys)); |
| 114 | + tableQuery = tableQuery.concat(createTable(sheet.title, sheet.data[0], handlePrimaryKey(options))); |
82 | 115 | insertQuery = insertQuery.concat(insert(sheet.title, sheet.data)); |
83 | 116 | }); |
84 | 117 |
|
|
0 commit comments