Skip to content

Commit 6875fad

Browse files
author
Jim Murphy
committed
fix(excel.ts): update all packages. release for node 16-20. fix null issue
1 parent 09fee79 commit 6875fad

File tree

2 files changed

+152
-175
lines changed

2 files changed

+152
-175
lines changed

src/main.ts

Lines changed: 1 addition & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1 @@
1-
import { excelToPostgresDb } from './sql';
2-
3-
const paths = [
4-
'/Users/jim/Documents/workspace/excel-to-postgres/src/data/rankings.xlsx',
5-
// "/Users/jim/Documents/workspace/excel-to-postgres/src/data/hitter_projections.xlsx",
6-
// "/Users/jim/Documents/workspace/excel-to-postgres/src/data/pitcher_projections.xlsx",
7-
];
8-
9-
paths.forEach((file) =>
10-
excelToPostgresDb(
11-
{
12-
host: 'localhost',
13-
user: 'postgres',
14-
password: 'postgres',
15-
port: 5432,
16-
database: 'baseball',
17-
},
18-
file,
19-
{
20-
createDatabase: false,
21-
createTables: true,
22-
}
23-
)
24-
);
1+
export { excelToPostgresDb } from "./sql";

src/sql.ts

Lines changed: 151 additions & 151 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,19 @@
1-
import { Pool } from 'pg';
1+
import { Pool } from "pg";
22
import {
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

1313
export 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

1919
export interface Connection {
@@ -32,177 +32,177 @@ export interface Options {
3232
}
3333

3434
export 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

4242
export 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

6464
export 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

8383
export 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

117117
async 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

129129
export 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

143143
export 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

181181
async 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

197197
async 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

Comments
 (0)