0.5.1 • Published 4 years ago
@rainbunny/pg-extensions v0.5.1
pg-extensions
Add more functions into the original pg package such as query builder, extended pool, extended client. It helps us to interact with Postgres easier then using an external ORM. The package is written in Typescript.
Installation
yarn add @rainbunny/pg-extensions
How to use
Initialize the pool from this package instead of the original pool. It's an extended pool which has same functionalities as the original one with extended functions.
Promise style
import {Pool} from '@rainbunny/pg-extensions';
const writePool = new Pool({
host: process.env.POSTGRES_HOST,
port: +process.env.POSTGRES_PORT,
database: process.env.POSTGRES_DB,
user: process.env.POSTGRES_USER,
password: process.env.POSTGRES_PASSWORD,
ssl: Boolean(process.env.POSTGRES_SSL),
// new option, optional
log: (message: string | {queryText: string; params: unknown[] | undefined; duration: number}) => {
console.log(message);
// should log message or the query execution (only queries from extended functions are logged):
// {
// queryText: "select * from app_user where id = $1",
// params: [1],
// duration: 100, --milliseconds
// }
},
});
writePool.on('error', (err) => console.log(err));
writePool.on('connect', () => console.log('Connected to write database'));
pool.executeQuery (Promise)
Use this function instead of the original pool.query function.
const result = await pool.executeQuery({
queryText: 'select id, username, createAt as "createdAt" from app_user where id = :id',
// optional params
params: {
id: '1',
},
});
// Generated query
// select id, username, createAt as "createdAt" from app_user where id = $1
// Params: ['1'];
// result = [{id: '1', username: 'admin', createdAt: 1617869191488}]
type executeQuery = <T>(query: DbQuery) => Promise<T[]>;
You may query a table. It can use named parameters and resolve the problem of camelCase property name in the query result.
const result = await pool.executeQuery({
table: 'app_user',
whereClause: 'createdAt >= :createdAt AND tsv @@ to_tsquery(:searchTerm)', // optional
fields: ['id', 'username', 'createdAt'], // optional
sortBy: ['username|ASC', 'createdAt|DESC'], // optional
pageIndex: 2, // optional
rowsPerPage: 5, // optional
// optional
params: {
searchTerm: 'admin',
createdAt: 1617869191488,
},
});
// Generated query
// SELECT id as "id",username as "username",createdAt as "createdAt" FROM app_user WHERE createdAt >= $4 AND tsv @@ to_tsquery($3) ORDER BY username ASC, createdAt DESC LIMIT $1 OFFSET $2
// Params: [5, 10, 'admin', 1617869191488];
// result = [{id: 1, username: 'admin', createdAt: 1617869191488}]
Observable style
import {RxPool} from '@rainbunny/pg-extensions';
const pool = new RxPool({
host: process.env.POSTGRES_HOST,
port: +process.env.POSTGRES_PORT,
database: process.env.POSTGRES_DB,
user: process.env.POSTGRES_USER,
password: process.env.POSTGRES_PASSWORD,
ssl: Boolean(process.env.POSTGRES_SSL),
// new option, optional
log: (message: string | {queryText: string; params: unknown[] | undefined; duration: number}) => {
console.log(message);
// should log message or the query execution (only queries from extended functions are logged):
// {
// queryText: "select * from app_user where id = $1",
// params: [1],
// duration: 100, --milliseconds
// }
},
});
pool.on('error', (err) => console.log(err));
pool.on('connect', () => console.log('Connected to database'));
pool.executeQuery (Observable)
Use this function instead of the original pool.query function.
pool
.executeQuery({
queryText: 'select id, username, createAt as "createdAt" from app_user where id = :id',
// optional params
params: {
id: '1',
},
})
.subscribe({
next: (result) => {
console.log(result);
},
});
// Generated query
// select id, username, createAt as "createdAt" from app_user where id = $1
// Params: ['1'];
// result = [{id: '1', username: 'admin', createdAt: 1617869191488}]
type executeQuery = <T>(query: DbQuery) => Promise<T[]>;
You may query a table. It can use named parameters and resolve the problem of camelCase property name in the query result.
pool
.executeQuery({
table: 'app_user',
whereClause: 'createdAt >= :createdAt AND tsv @@ to_tsquery(:searchTerm)', // optional
fields: ['id', 'username', 'createdAt'], // optional
sortBy: ['username|ASC', 'createdAt|DESC'], // optional
pageIndex: 2, // optional
rowsPerPage: 5, // optional
// optional
params: {
searchTerm: 'admin',
createdAt: 1617869191488,
},
})
.subscribe({
next: (result) => {
console.log(result);
},
});
// Generated query
// SELECT id as "id",username as "username",createdAt as "createdAt" FROM app_user WHERE createdAt >= $4 AND tsv @@ to_tsquery($3) ORDER BY username ASC, createdAt DESC LIMIT $1 OFFSET $2
// Params: [5, 10, 'admin', 1617869191488];
// result = [{id: 1, username: 'admin', createdAt: 1617869191488}]