1- import { Pool } from 'pg' ;
1+ import { Pool } from "pg" ;
22import {
3- Column ,
4- Fields ,
5- formatColumns ,
6- formatPrimaryKey ,
7- generatePrimaryKey ,
8- getColumns ,
9- getFields ,
10- } from ' ./etl-processes' ;
11- import { readExcel } from ' ./excel' ;
3+ Column ,
4+ Fields ,
5+ formatColumns ,
6+ formatPrimaryKey ,
7+ generatePrimaryKey ,
8+ getColumns ,
9+ getFields ,
10+ } from " ./etl-processes" ;
11+ import { readExcel } from " ./excel" ;
1212
1313export enum PrimaryKeyOptions {
14- GENERATE = ' GENERATE' ,
15- USE_EXISTING = ' USE EXISTING' ,
16- NO_PRIMARY_KEY = ' NO PRIMARY KEY' ,
14+ GENERATE = " GENERATE" ,
15+ USE_EXISTING = " USE EXISTING" ,
16+ NO_PRIMARY_KEY = " NO PRIMARY KEY" ,
1717}
1818
1919export interface Connection {
@@ -32,177 +32,177 @@ export interface Options {
3232}
3333
3434export function createDatabase ( dbName : string ) : string {
35- try {
36- return `CREATE DATABASE ${ dbName } ;` ;
37- } catch ( err ) {
38- console . error ( err ) ;
39- }
35+ try {
36+ return `CREATE DATABASE ${ dbName } ;` ;
37+ } catch ( err ) {
38+ console . error ( err ) ;
39+ }
4040}
4141
4242export function createTable < T > (
43- tableName : string ,
44- data : T ,
45- primaryKeyOptions : string
43+ tableName : string ,
44+ data : T ,
45+ primaryKeyOptions : string
4646) : string {
47- try {
48- const fields : Fields < T > = getFields ( data ) ;
49- const columns : Column [ ] = getColumns ( fields ) ;
47+ try {
48+ const fields : Fields < T > = getFields ( data ) ;
49+ const columns : Column [ ] = getColumns ( fields ) ;
5050
51- const formattedColumns : string [ ] = checkPrimaryKeyOptions (
52- primaryKeyOptions ,
53- columns
54- ) ;
51+ const formattedColumns : string [ ] = checkPrimaryKeyOptions (
52+ primaryKeyOptions ,
53+ columns
54+ ) ;
5555
56- return `CREATE TABLE ${ tableName . replace ( / \s / g, '' ) } (
56+ return `CREATE TABLE ${ tableName . replace ( / \s / g, "" ) } (
5757 ${ formattedColumns }
5858 );` ;
59- } catch ( err ) {
60- console . error ( err ) ;
61- }
59+ } catch ( err ) {
60+ console . error ( err ) ;
61+ }
6262}
6363
6464export function checkPrimaryKeyOptions (
65- primaryKeyOptions : string ,
66- columns : Column [ ]
65+ primaryKeyOptions : string ,
66+ columns : Column [ ]
6767) : string [ ] {
68- try {
69- if ( primaryKeyOptions === PrimaryKeyOptions . GENERATE ) {
70- return generatePrimaryKey ( formatColumns ( columns ) ) ;
71- } else if ( primaryKeyOptions === PrimaryKeyOptions . USE_EXISTING ) {
72- return formatPrimaryKey ( formatColumns ( columns ) ) ;
73- } else if ( primaryKeyOptions === PrimaryKeyOptions . NO_PRIMARY_KEY ) {
74- return formatColumns ( columns ) . formattedColumns ;
75- } else {
76- return ;
77- }
78- } catch ( err ) {
79- console . error ( err ) ;
80- }
68+ try {
69+ if ( primaryKeyOptions === PrimaryKeyOptions . GENERATE ) {
70+ return generatePrimaryKey ( formatColumns ( columns ) ) ;
71+ } else if ( primaryKeyOptions === PrimaryKeyOptions . USE_EXISTING ) {
72+ return formatPrimaryKey ( formatColumns ( columns ) ) ;
73+ } else if ( primaryKeyOptions === PrimaryKeyOptions . NO_PRIMARY_KEY ) {
74+ return formatColumns ( columns ) . formattedColumns ;
75+ } else {
76+ return ;
77+ }
78+ } catch ( err ) {
79+ console . error ( err ) ;
80+ }
8181}
8282
8383export function insert < T > ( table : string , data : T [ ] ) : string {
84- try {
85- const columns = getFields ( data [ 0 ] ) . names ;
86- let insertQuery = `INSERT INTO ${ table . replace (
87- / \s / g,
88- ''
89- ) } (${ columns } ) VALUES `;
90-
91- data . forEach ( ( row , index ) => {
92- const values = getFields ( row ) . values ;
93-
94- const fieldValues = [ ] ;
95- values . forEach ( ( value ) => {
96- if ( typeof value === ' string' ) {
97- fieldValues . push ( `'${ value . replace ( / ' / g, '\'\'' ) } '` ) ;
98- } else {
99- fieldValues . push ( `${ value } ` ) ;
100- }
101- } ) ;
102-
103- insertQuery = insertQuery . concat ( `(${ fieldValues } )` ) ;
104- if ( data . length - 1 > index ) {
105- insertQuery = insertQuery . concat ( ',' ) ;
106- } else {
107- insertQuery = insertQuery . concat ( ';' ) ;
108- }
109- } ) ;
110-
111- return insertQuery ;
112- } catch ( err ) {
113- console . error ( err ) ;
114- }
84+ try {
85+ const columns = getFields ( data [ 0 ] ) . names ;
86+ let insertQuery = `INSERT INTO ${ table . replace (
87+ / \s / g,
88+ ""
89+ ) } (${ columns } ) VALUES `;
90+
91+ data . forEach ( ( row , index ) => {
92+ const values = getFields ( row ) . values ;
93+
94+ const fieldValues = [ ] ;
95+ values . forEach ( ( value ) => {
96+ if ( typeof value === " string" ) {
97+ fieldValues . push ( `'${ value . replace ( / ' / g, "''" ) } '` ) ;
98+ } else {
99+ fieldValues . push ( `${ value } ` ) ;
100+ }
101+ } ) ;
102+
103+ insertQuery = insertQuery . concat ( `(${ fieldValues } )` ) ;
104+ if ( data . length - 1 > index ) {
105+ insertQuery = insertQuery . concat ( "," ) ;
106+ } else {
107+ insertQuery = insertQuery . concat ( ";" ) ;
108+ }
109+ } ) ;
110+
111+ return insertQuery ;
112+ } catch ( err ) {
113+ console . error ( err ) ;
114+ }
115115}
116116
117117async function executeQuery ( connectionInfo : Connection , query : string ) {
118- const pool = new Pool ( { ...connectionInfo } ) ;
118+ const pool = new Pool ( { ...connectionInfo } ) ;
119119
120- try {
121- await pool . query ( query ) ;
122- } catch ( err ) {
123- return console . log ( err ) ;
124- }
120+ try {
121+ await pool . query ( query ) ;
122+ } catch ( err ) {
123+ return console . log ( err ) ;
124+ }
125125
126- await pool . end ( ) ;
126+ await pool . end ( ) ;
127127}
128128
129129export function handlePrimaryKey ( options : Options ) : string {
130- try {
131- if ( options . generatePrimaryKey ) {
132- return PrimaryKeyOptions . GENERATE ;
133- } else if ( options . useExistingPrimaryKeys ) {
134- return PrimaryKeyOptions . USE_EXISTING ;
135- } else {
136- return PrimaryKeyOptions . NO_PRIMARY_KEY ;
137- }
138- } catch ( err ) {
139- console . error ( err ) ;
140- }
130+ try {
131+ if ( options . generatePrimaryKey ) {
132+ return PrimaryKeyOptions . GENERATE ;
133+ } else if ( options . useExistingPrimaryKeys ) {
134+ return PrimaryKeyOptions . USE_EXISTING ;
135+ } else {
136+ return PrimaryKeyOptions . NO_PRIMARY_KEY ;
137+ }
138+ } catch ( err ) {
139+ console . error ( err ) ;
140+ }
141141}
142142
143143export async function excelToPostgresDb (
144- connectionInfo : Connection ,
145- filePath : string ,
146- options ?: Options
144+ connectionInfo : Connection ,
145+ filePath : string ,
146+ options ?: Options
147147) : Promise < void > {
148- try {
149- if ( options ?. generatePrimaryKey && options ?. useExistingPrimaryKeys ) {
150- return console . error (
151- ' Cannot generate primary keys column and also use existing primary keys'
152- ) ;
153- }
154-
155- const sheets = readExcel ( filePath ) ;
156-
157- let insertQuery = '' ;
158- let tableQuery = '' ;
159-
160- sheets . forEach ( async ( sheet ) => {
161- tableQuery = tableQuery . concat (
162- createTable ( sheet . title , sheet . data [ 0 ] , handlePrimaryKey ( options ) )
163- ) ;
164- insertQuery = insertQuery . concat ( insert ( sheet . title , sheet . data ) ) ;
165- } ) ;
166-
167- if ( options && options . createDatabase ) {
168- executeQueryWithCreateDB ( connectionInfo , tableQuery , insertQuery ) ;
169- } else if ( options && ! options . createDatabase && options . createTables ) {
170- executeQueryWithCreateTable ( connectionInfo , tableQuery , insertQuery ) ;
171- } else if ( ! options . createDatabase && ! options . createTables ) {
172- await executeQuery ( connectionInfo , insertQuery ) ;
173- } else {
174- console . log ( ' No changes made...' ) ;
175- }
176- } catch ( err ) {
177- console . error ( err ) ;
178- }
148+ try {
149+ if ( options ?. generatePrimaryKey && options ?. useExistingPrimaryKeys ) {
150+ return console . error (
151+ " Cannot generate primary keys column and also use existing primary keys"
152+ ) ;
153+ }
154+
155+ const sheets = readExcel ( filePath ) ;
156+
157+ let insertQuery = "" ;
158+ let tableQuery = "" ;
159+
160+ sheets . forEach ( async ( sheet ) => {
161+ tableQuery = tableQuery . concat (
162+ createTable ( sheet . title , sheet . data [ 0 ] , handlePrimaryKey ( options ) )
163+ ) ;
164+ insertQuery = insertQuery . concat ( insert ( sheet . title , sheet . data ) ) ;
165+ } ) ;
166+
167+ if ( options && options . createDatabase ) {
168+ executeQueryWithCreateDB ( connectionInfo , tableQuery , insertQuery ) ;
169+ } else if ( options && ! options . createDatabase && options . createTables ) {
170+ executeQueryWithCreateTable ( connectionInfo , tableQuery , insertQuery ) ;
171+ } else if ( ! options . createDatabase && ! options . createTables ) {
172+ await executeQuery ( connectionInfo , insertQuery ) ;
173+ } else {
174+ console . log ( " No changes made..." ) ;
175+ }
176+ } catch ( err ) {
177+ console . error ( err ) ;
178+ }
179179}
180180
181181async function executeQueryWithCreateDB (
182- connectionInfo : Connection ,
183- tableQuery : string ,
184- insertQuery : string
182+ connectionInfo : Connection ,
183+ tableQuery : string ,
184+ insertQuery : string
185185) {
186- try {
187- const initialConnect = { ...connectionInfo , database : null } ;
188-
189- await executeQuery ( initialConnect , createDatabase ( connectionInfo . database ) ) ;
190- await executeQuery ( connectionInfo , tableQuery ) ;
191- await executeQuery ( connectionInfo , insertQuery ) ;
192- } catch ( err ) {
193- console . error ( err ) ;
194- }
186+ try {
187+ const initialConnect = { ...connectionInfo , database : null } ;
188+
189+ await executeQuery ( initialConnect , createDatabase ( connectionInfo . database ) ) ;
190+ await executeQuery ( connectionInfo , tableQuery ) ;
191+ await executeQuery ( connectionInfo , insertQuery ) ;
192+ } catch ( err ) {
193+ console . error ( err ) ;
194+ }
195195}
196196
197197async function executeQueryWithCreateTable (
198- connectionInfo : Connection ,
199- tableQuery : string ,
200- insertQuery : string
198+ connectionInfo : Connection ,
199+ tableQuery : string ,
200+ insertQuery : string
201201) {
202- try {
203- await executeQuery ( connectionInfo , tableQuery ) ;
204- await executeQuery ( connectionInfo , insertQuery ) ;
205- } catch ( err ) {
206- console . error ( err ) ;
207- }
202+ try {
203+ await executeQuery ( connectionInfo , tableQuery ) ;
204+ await executeQuery ( connectionInfo , insertQuery ) ;
205+ } catch ( err ) {
206+ console . error ( err ) ;
207+ }
208208}
0 commit comments