文章结构
    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. Unreal 输入系统 解析

    前言 输入系统,输入某个键,响应到GamePlay层做对应的事.例如 点击鼠标,前进还是开枪之类,是如何响应的.这里只说应用层逻辑,硬件层逻辑不讲述. 详解 1.问题来源 先看下面一个例子:跳跃的事件 ...

  2. 面试官:我把数据库部署在Docker容器内,你觉得如何?

    开源Linux 一个执着于技术的公众号 上一篇:CentOS 7上搭建Zabbix4.0 近2年Docker非常的火热,各位开发者恨不得把所有的应用.软件都部署在Docker容器中,但是您确定也要把数 ...

  3. CRM项目的整理-----第二篇

    1.项目的登录 1.1 app创建二级路由 2.登录页面   http://www.jq22.com/

  4. Bert不完全手册5. 推理提速?训练提速!内存压缩!Albert

    Albert是A Lite Bert的缩写,确实Albert通过词向量矩阵分解,以及transformer block的参数共享,大大降低了Bert的参数量级.在我读Albert论文之前,因为Albe ...

  5. 我用13行摆烂了你的oj4

    13行代码AC oj4是怎么回事呢?13行代码AC oj4相信大家都很熟悉,但是13行代码AC oj4是怎么回事呢,下面就让小编带大家一起了解吧.13行代码AC oj4,其实就是13行代码AC oj4 ...

  6. Python常用标准库(pickle序列化和JSON序列化)

    常用的标准库 序列化模块 import pickle 序列化和反序列化 把不能直接存储的数据变得可存储,这个过程叫做序列化.把文件中的数据拿出来,回复称原来的数据类型,这个过程叫做反序列化. 在文件中 ...

  7. Vue基础之 动态组件

    为什么会有动态组件> vue 通过组件机制 实现的页面功能的模块化处理,通常情况下 我们在vue中使用组件  就是先定义组件 然后再需要的地方 插入组件即可 但是在某些情况下 需要根据不同的需求 ...

  8. Python 微博搜索爬虫

    微博搜索爬虫 网页分析 由于网页端反爬虫机制比较完善所以才去移动端进行爬虫. url地址:https://m.weibo.cn/ 搜索框,输入关键词进行搜索 对网页进行抓包,找到相关数据 查看数据是否 ...

  9. ES6 - promise(1)

    今天决定对之前学过的一些前端的知识进行梳理和总结,因为最近都是独自承担项目的开发与搭建,所以先从前后端交互的第一线axios来梳理,复习axios首先一定要先复习promise对象. 什么是promi ...

  10. python实现一个加密的文字处理器

    这是一个类似于记事本的文字处理器.与正常的记事本不同的是,它会将文本文档进行加密,确保无法被常规的程序打开. 由于本人是一位业余编程爱好者,对于"python之禅"之类的规则比较不 ...