typescript关于postgres数据库的API封装
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封装的更多相关文章
- Actix-web Rust连接Postgres数据库
Actix-web Rust连接Postgres数据库 Rust1.39支持了异步async,await,Actix-web在2.0.0-alpha支持了原生异步写法,所以本文中使用的Actix- ...
- [Kong 与 Konga与postgres数据库] 之 Kuberneres 部署
1.Kong的概述 Kong是一个clould-native.快速的.可扩展的.分布式的微服务抽象层(也称为API网关.API中间件或在某些情况下称为服务网格)框架.Kong作为开源项目在2015年推 ...
- [Kong 与 Konga 与 Postgres数据库] 之 Kuberneres 部署
1.Kong的概述 Kong是一个clould-native.快速的.可扩展的.分布式的微服务抽象层(也称为API网关.API中间件或在某些情况下称为服务网格)框架.Kong作为开源项目在2015年推 ...
- C#开发微信门户及应用(32)--微信支付接入和API封装使用
在微信的应用上,微信支付是一个比较有用的部分,但也是比较复杂的技术要点,在微商大行其道的年代,自己的商店没有增加微信支付好像也说不过去,微信支付旨在为广大微信用户及商户提供更优质的支付服务,微信的支付 ...
- pgadmin(IDE)工具连接postgres数据库
1. 下载软件 软件地址:http://www.pgadmin.org/download/pgagent.php 2.安装软件 安装过程:略 打开软件64位会出现 “无 ...
- ubuntu crontab 定时备份postgres数据库并上传ftp服务器
最近公司要求备份数据库,所以就查了比较作的资料.废话不多说,入正题. 目的:定期备份ubuntu下的postgres数据库,打包上传到指定ftp服务器. 经过查找资料,解决方法: ①编写备份数据库.打 ...
- PHP中对数据库操作的封装
在动态网面设计中很多都要涉及到对数据库的操作,但是有时跟据需要而改用其它后台数据库,就需要大量修改程序.这是一件枯燥.费时而且容易出错的功作.其实我们可以用PHP中的类来实现对数据库操作的封装,从而使 ...
- postgres数据库中的数据转换
postgres8.3以后,字段数据之间的默认转换取消了.如果需要进行数据变换的话,在postgres数据库中,我们可以用"::"来进行字段数据的类型转换.实际上"::& ...
- C# .NET更智能的数据库操作的封装完整版(重构)
前述: 第一次发表文章,不过是对数据库简单的封装,主要是阐述下思路.那么在上篇文章,在大家的指导下和提出意见,并自己对代码进行了思考.在这两天我重构了新的框架,我觉得我写的可以称得上框架,为什么?请大 ...
随机推荐
- 2.4 小白必看:零基础安装Linux系统(超级详细)
我们以新发布的 CentOS 8.1 为例,学习如何安装Linux系统. 准备工作: 1. 一台可以访问互联网的电脑 2. VMware Workstation安装包 3. CentOS8.1镜像文件 ...
- 谁动了我的主机? 之活用History命令
点击上方"开源Linux",选择"设为星标" 回复"学习"获取独家整理的学习资料! Linux系统下可通过history命令查看用户所有的历 ...
- 高级IPC DBus
What is IPC IPC [Inter-Process Communication] 进程间通信,指至少两个进程或线程间传送数据或信号的一些技术或方法.在Linux/Unix中,提供了许多IPC ...
- leetcode 142. Linked List Cycle II 环形链表 II
一.题目大意 https://leetcode.cn/problems/linked-list-cycle-ii/ 给定一个链表的头节点 head ,返回链表开始入环的第一个节点. 如果链表无环,则 ...
- arts-week9
Algorithm 521. Longest Uncommon Subsequence I - LeetCode Review 如何搭建一个私有的CDN? 大部分情况下,我们使用市场上现有的 CDN ...
- HIVE 数据分析
题目要求: 具体操作: ①hive路径下建表:sale create table sale (day_id String, sale_nbr String, buy_nbr String, cnt S ...
- ERP采购收货在标准成本和移动平均价下的差别
欢迎关注微信公众号:iERPer (ERP咨询顾问之家) ERP系统在处理主要的采购流程有: 下采购合同->下采购订单->收货->发票校验->付款(财务) 其中 收货和发票校验 ...
- 基于Kubernetes v1.24.0的集群搭建(一)
一.写在前面 K8S 1.24作为一个很重要的版本更新,它为我们提供了很多重要功能.该版本涉及46项增强功能:其中14项已升级为稳定版,15项进入beta阶段,13项则刚刚进入alpha阶段.此外,另 ...
- .NET 6.0.6 和 .NET Core 3.1.26、Visual Studio 2022 17.2 和 17.3 Preview 2 和 .NET 7.0 Preview 5 同时发布
Microsoft 昨天发布了适用于 .NET 6.0.6 和 .NET Core 3.1.26.NuGet.Visual Studio 2019 和 Visual Studio 2022 17.2 ...
- BI与SaaS碰撞,让数据处理更加轻松(下)
背景 在上篇内容中,我们从SaaS各种功能的角度为大家介绍了在数据处理中SaaS的巨大价值,而本次我们将用实例将为大家展示SaaS与BI间的碰撞又会产生怎样的火花. BI与SaaS集成示例 通常BI分 ...