文章结构
    1 新建 postgres.ts 文件
    2 配置文件说明
    3 依赖引用说明
    4 API使用示例
 
1 新建 postgres.ts 文件,代码如下:
import { Pool, PoolClient, QueryResult } from 'pg';
import { CONFIG } from './config'; const pg_pool = new Pool(CONFIG.pg);
pg_pool.on('error', (err, client) => {
console.error('Error on idle client', err.message || err + '');
}); class DB {
private mPool: Pool;
constructor(pool: Pool) {
this.mPool = pool;
}
async connect(): Promise<DBSession> {
const client = await this.mPool.connect();
return new DBSession(client);
} async doTrans(callback: (dbs: DBSession) => Promise<unknown>): Promise<unknown> {
const dbs = await this.connect();
try {
await dbs.begin();
const result = await callback(dbs);
await dbs.commit();
return result;
} catch (e) {
await dbs.rollback();
console.error('DB.doTrans() error, rollback:', e);
throw e;
} finally {
dbs.close();
}
} async run(callback: (dbs: DBSession) => Promise<unknown>): Promise<unknown> {
const dbs = await this.connect();
try {
return await callback(dbs);
} catch (e) {
console.error('DB.execute() error:', e);
throw e;
} finally {
dbs.close();
}
} async queryList(sql: string, ...parameters: any[]): Promise<any[]> {
const result = await this.mPool.query(sql, parameters);
if (!result || !(result.rows instanceof Array)) {
return [];
}
return result.rows;
} async queryFirst(sql: string, ...parameters: any[]): Promise<any> {
const result = await this.mPool.query(sql, parameters);
if (result && result.rowCount > 0) {
return result.rows[0];
} else {
return null;
}
} async queryValue(sql: string, ...parameters: any[]): Promise<unknown> {
const result = await this.mPool.query(sql, parameters);
if (result && result.rowCount > 0) {
const key = result.fields[0].name;
return result.rows[0][key];
} else {
return null;
}
} async query(sql: string, ...parameters: any[]): Promise<QueryResult<any>> {
return await this.mPool.query(sql, parameters);
}
} const pgDB = new DB(pg_pool);
export { pgDB }; class DBSession {
private _client: PoolClient;
private _transaction = false; constructor(client: PoolClient) {
this._client = client;
}
async begin(): Promise<void> {
await this._client.query('begin');
this._transaction = true;
} async commit(): Promise<void> {
await this._client.query('commit');
this._transaction = false;
} async savepoint(id: string): Promise<void> {
await this._client.query('savepoint $1', [id]);
} async rollback(savepoint?: string): Promise<void> {
if (savepoint) {
await this._client.query('rollback to savepoint $1', [savepoint]);
} else {
await this._client.query('rollback');
this._transaction = false;
}
}
async queryList(sql: string, ...parameters: any[]): Promise<any[]> {
const result = await this._client.query(sql, parameters);
if (!result || !(result.rows instanceof Array)) {
return [];
}
return result.rows;
}
async queryFirst(sql: string, ...parameters: any[]): Promise<any> {
const result = await this._client.query(sql, parameters);
if (result && result.rowCount > 0) {
return result.rows[0];
} else {
return null;
}
}
async queryValue(sql: string, ...parameters: any[]): Promise<unknown> {
const result = await this._client.query(sql, parameters);
if (result && result.rowCount > 0) {
const key = result.fields[0].name;
return result.rows[0][key];
} else {
return null;
}
}
async query(sql: string, ...parameters: any[]): Promise<QueryResult<any>> {
return await this._client.query(sql, parameters);
} close() {
if (this._transaction) {
this.rollback();
}
this._client.release();
}
}

2 新建config.ts配置文件,配置数据源

import ps from 'process';

export const CONFIG = {
pg: {
connectionString: ps.env.PG_URL || 'postgresql://用户名:密码@IP:端口/数据库',
max: 1,
min: 0,
idleTimeoutMillis: 30000,
},
};

  对于数据源的配置,账号密码注意对符号进行转义。如 @ 需要转为 %40等。

3 文章中依赖引用说明

postgres依赖: "@types/pg": "^8.6.1"

4 使用示例

首先在需要的文件中导入API。文件位置按照实际进行更改。

import { pgDB } from '../postgres';

4.1  查询单值

const QUERY_VALUE_SQL = `
select name from tb_table a where a.id = $1
`;
const id = await pgDB.queryValue(
QUERY_VALUE_SQL ,
5
);

4.2 查询单行数据

const QUERY_SQL = `
select id,name from tb_table a where a.id = $1
`;
const result = await pgDB.queryFirst(QUERY_SQL , 1);

4.3 查询List多行数据

const QUERY_LIST_SQL =   `
select id,name from tb_table a where id = $1 or id = $2
`; const result = await pgDB.queryList(QUERY_LIST_SQL , 1, 2);

修改,删除,事务等示例后续补充。    

  

typescript关于postgres数据库的API封装的更多相关文章

  1. Actix-web Rust连接Postgres数据库

    Actix-web Rust连接Postgres数据库 ​ Rust1.39支持了异步async,await,Actix-web在2.0.0-alpha支持了原生异步写法,所以本文中使用的Actix- ...

  2. [Kong 与 Konga与postgres数据库] 之 Kuberneres 部署

    1.Kong的概述 Kong是一个clould-native.快速的.可扩展的.分布式的微服务抽象层(也称为API网关.API中间件或在某些情况下称为服务网格)框架.Kong作为开源项目在2015年推 ...

  3. [Kong 与 Konga 与 Postgres数据库] 之 Kuberneres 部署

    1.Kong的概述 Kong是一个clould-native.快速的.可扩展的.分布式的微服务抽象层(也称为API网关.API中间件或在某些情况下称为服务网格)框架.Kong作为开源项目在2015年推 ...

  4. C#开发微信门户及应用(32)--微信支付接入和API封装使用

    在微信的应用上,微信支付是一个比较有用的部分,但也是比较复杂的技术要点,在微商大行其道的年代,自己的商店没有增加微信支付好像也说不过去,微信支付旨在为广大微信用户及商户提供更优质的支付服务,微信的支付 ...

  5. pgadmin(IDE)工具连接postgres数据库

    1. 下载软件        软件地址:http://www.pgadmin.org/download/pgagent.php   2.安装软件    安装过程:略    打开软件64位会出现  “无 ...

  6. ubuntu crontab 定时备份postgres数据库并上传ftp服务器

    最近公司要求备份数据库,所以就查了比较作的资料.废话不多说,入正题. 目的:定期备份ubuntu下的postgres数据库,打包上传到指定ftp服务器. 经过查找资料,解决方法: ①编写备份数据库.打 ...

  7. PHP中对数据库操作的封装

    在动态网面设计中很多都要涉及到对数据库的操作,但是有时跟据需要而改用其它后台数据库,就需要大量修改程序.这是一件枯燥.费时而且容易出错的功作.其实我们可以用PHP中的类来实现对数据库操作的封装,从而使 ...

  8. postgres数据库中的数据转换

    postgres8.3以后,字段数据之间的默认转换取消了.如果需要进行数据变换的话,在postgres数据库中,我们可以用"::"来进行字段数据的类型转换.实际上"::& ...

  9. C# .NET更智能的数据库操作的封装完整版(重构)

    前述: 第一次发表文章,不过是对数据库简单的封装,主要是阐述下思路.那么在上篇文章,在大家的指导下和提出意见,并自己对代码进行了思考.在这两天我重构了新的框架,我觉得我写的可以称得上框架,为什么?请大 ...

随机推荐

  1. Spring 源码(9)Spring Bean的创建过程的前期准备

    回顾总结 到目前为止,Spring源码中AbstractApplicationContext#refresh方法的已经解读到第11个方法finishBeanFactoryInitialization, ...

  2. clientWidth、offsetWidth、scrollWidth……

    1.元素视图属性 clientWidth:元素内容可视区宽度(水平方向 width + 左右 padding). clientHeight:元素内容可视高度(垂直方向 height + 上下paddi ...

  3. 隐藏浏览器header中X-Powered-By: PHP信息

    在php程序中,默认会在http请求响应头中输出php版本信息.如下: HTTP/1.1 200 OK Content-Type: text/html; charset=utf-8 Date: Tue ...

  4. python和pycharm下载与安装

    python解释器 1.python的由来 Python诞生于1989年的一个圣诞节,其创作者Guido van Rossum为了打发圣诞节假期的无聊,便开始了Python语言的编写.Python第一 ...

  5. zabbix的web界面访问失败问题排查

    现象:用curl访问显示拒绝链接,查看zabbix-server日志也无异常 1.检查防火墙,SElinux是否关闭 2.检查zabbix-server服务是否启动 3.检查80端口是否被占用,比方是 ...

  6. 152. Maximum Product Subarray - LeetCode

    Question 152. Maximum Product Subarray Solution 题目大意:求数列中连续子序列的最大连乘积 思路:动态规划实现,现在动态规划理解的还不透,照着公式往上套的 ...

  7. unity---动画基础

    旧动画系统 using System.Collections; using System.Collections.Generic; using UnityEngine; public class Mo ...

  8. st表 LCA

    我当时知道ST表可以 \(O(1)\) 求 LCA 的时候是极为震惊的,可以在需要反复使用 LCA 的时候卡常使用. ST表!用于解决 RMQ问题 ST表 我可能写得不好,看专业的 怎么实现? 考虑把 ...

  9. ZJOI2020

    [ZJOI2015] 地震后的幻想乡 给定一个无向图 \(G\) ,\(n\) 个点 \(m\) 条边每条边权为 \([0,1]\) 的随机实数,求这张图的最小生成树的最大边权期望. \(1\le n ...

  10. 关于『HTML』:第二弹

    关于『HTML』:第二弹 建议缩放90%食用 第二弹! 它来了! 它来了! 我竟然没有拖更,对了,你们昨天用草稿纸了么 开始正文之前提一个问题:大家知道"%%%"是什么意思吗?就这 ...