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更智能的数据库操作的封装完整版(重构)
前述: 第一次发表文章,不过是对数据库简单的封装,主要是阐述下思路.那么在上篇文章,在大家的指导下和提出意见,并自己对代码进行了思考.在这两天我重构了新的框架,我觉得我写的可以称得上框架,为什么?请大 ...
随机推荐
- hover特效
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 移动端input的disabled属性对字体颜色影响
对于表单输入,input是很好的选择,这次记录主要是正对input的value值字体在Android和iOS(11)设备下显示不同问题: 如下图:1.2的区别主要是分别设置disabled.reado ...
- HCNP Routing&Switching之RSTP保护
前文我们了解了RSTP相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/16240348.html:今天我们来聊一聊RSTP保护相关话题: 我们知道RST ...
- MySQL深入学习-day1
书名<MySQL是怎样运行的:从根儿上理解MySQL>可自行百度 以下是知识点总结 重新认识Mysql MySQL是一个C/S架构的软件. 在Windows安装后首先注册成服务,然后会在开 ...
- 将MySQL查询结果导出到Excel
总结将mysql的查询结果导出到文件的方法 总结 使用命令 select user, host, password from mysql.user into outfile '/tmp/user.xl ...
- 通过python将阿里云DNS解析作为DDNS使用
通过python将阿里云DNS解析作为DDNS使用 脚本需要Python2.x运行 安装alidns python sdk sudo pip install aliyun-python-sdk-ali ...
- CoaXPress 时间戳 Time Stamping
背景 在CXP2.0之前,CXP没有定义Time Stamping时间戳的概念,但是用户对Time Stamping是有实际需求的,比如我们要对比多台设备拍摄同一个物体不同角度的照片,或者记录触发完成 ...
- Linux 中递归删除文件
递归删除当前目录下以 .json 结尾的文件 find . -name "*.json" | xargs rm -f find . -name "*.json" ...
- 『忘了再学』Shell流程控制 — 33、if条件判断语句(一)
目录 1.单分支if条件语句 2.双分支if条件语句 (1)示例1 (2)示例2 什么是流程控制? 普通理解:Shell编写的程序是顺序执行的,也就是说第一命令先执行,然后接着执行第二条命令,然后再下 ...
- Typora图片与阿里云OSS图床的结合之旅
图床? 专门用于存放图片,并允许用户通过独一的外链进行特定图片资源的访问 为什么是阿里云OSS(Object Storage Service) 码云开源需要审核,已经不能作为免费的图床使用(2022年 ...