暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

使用JavaScript连接PostgreSQL数据库

原创 张玉龙 2021-11-07
2736

PostgreSQL的客户端接口

在PostgreSQL发行版中只包含两个客户端接口: libpq 和 ECPG

  • libpq is included because it is the primary C language interface, and because many other client interfaces are built on top of it.
  • ECPG is included because it depends on the server-side SQL grammar, and is therefore sensitive to changes in PostgreSQL itself.

其他语言客户端接口:

Name Language Comments Website
DBD::Pg Perl Perl DBI driver https://metacpan.org/release/DBD-Pg
JDBC Java Type 4 JDBC driver https://jdbc.postgresql.org/
libpqxx C++ C++ interface https://pqxx.org/
node-postgres JavaScript Node.js driver https://node-postgres.com/
Npgsql .NET .NET data provider https://www.npgsql.org/
pgtcl Tcl - https://github.com/flightaware/Pgtcl
pgtclng Tcl - https://sourceforge.net/projects/pgtclng/
pq Go Pure Go driver for Go’s database/sql https://github.com/lib/pq
psqlODBC ODBC ODBC driver https://odbc.postgresql.org/
psycopg Python DB API 2.0-compliant https://www.psycopg.org/

简单介绍

Node.js

  简单的说 Node.js 就是运行在服务端的 JavaScript。
  Node.js 是一个 JavaScript 运行环境(runtime),它让 JavaScript 可以开发后端程序,它几乎能实现其他后端语言能实现的所有功能。
  Node.js 基于 Google V8 引擎,V8 引擎是 Google 发布的一款开源的 JavaScript 引擎,原来主要用于 Chrome 浏览器的 JS 解释部分,后来让 Ryan Dahi 把这个 V8 引擎搬到了服务器上,用做服务器的软件。
  Node.js 最擅长的就是处理高并发,在Java、PHP或者.net等服务器端语言中,会为每一个客户端连接创建一个新的线程。而每个线程需要耗费大约2MB内存。也就是说,理论上,一个8GB内存的服务器可以同时连接的最大用户数为4000个左右。要让Web应用程序支持更多的用户,就需要增加服务器的数量,而Web应用程序的硬件成本当然就上升了。Node.js不为每个客户连接创建一个新的线程,而仅仅使用一个线程。当有用户连接了,就触发一个内部事件,通过非阻塞I/O、事件驱动机制,让Node.js程序宏观上也是并行的。使用Node.js,一个8GB内存的服务器,可以同时处理超过4万用户的连接
  Node.js的官方网站:中文 https://nodejs.org/zh-cn/ 英文 https://nodejs.org/en/
  之前研究PostgreSQL高可用装 etcd-browser WEB可视化界面时用过 nodejs,使用 nodejs 启动 etcd-browser。
  PostgreSQL高可用测试系列之Patroni + etcd + HAProxy + Keepalived 离线部署(三) 7. etcd-browser WEB可视化界面

Node.js 连接各个数据库使用的包

数据库 包名 安装命令 github地址
PostgreSQL node-postgres npm install pg https://github.com/brianc/node-postgres
Oracle node-oracledb npm install oracledb https://github.com/oracle/node-oracledb
Mysql node-mysql2 npm install --save mysql2 https://github.com/sidorares/node-mysql2
SQL Server node-mssql npm install mssql https://github.com/tediousjs/node-mssql
MongoDB node-mongodb-native npm install mongodb https://github.com/mongodb/node-mongodb-native
IBM DB2 node-ibm_db npm install ibm_db https://github.com/ibmdb/node-ibm_db
openGauss node-opengauss npm install node-opengauss --save https://github.com/lolimay/node-opengauss
达梦8 dmdb npm install dmdb -

node-postgres

  node-postgres 是一组 node.js 模块,用于与 PostgreSQL 数据库交互。
  node-postgres的官方网站: https://node-postgres.com/

环境准备

  1. 下载安装 nodejs
    nodejs下载地址:https://nodejs.org/zh-cn/download/ 文件:node-v16.13.0-linux-x64.tar.xz
# 安装nodejs,已经编译好的包,解压即是安装 [root@pgtest3 ~]# tar -xvf /enmo/soft/node-v16.13.0-linux-x64.tar.xz -C /enmo/app [root@pgtest3 ~]# mv /enmo/app/node-v16.13.0-linux-x64 /enmo/app/node-16.13.0 [root@pgtest3 ~]# ln -s /enmo/app/node-16.13.0 /enmo/app/nodejs [root@pgtest3 ~]# sed -i "s;:\$PATH:;:/enmo/app/nodejs/bin:\$PATH:;g" /etc/profile [root@pgtest3 ~]# source /etc/profile [root@pgtest3 ~]# node -v v16.13.0
  1. 下载安装 node-postgres
    node-postgres下载地址:https://github.com/brianc/node-postgres 文件:node-postgres-master.zip
    安装 node-postgres 需要使用 npm 命令或者 cnpm 命令。npm 是随同 Node.js 一起安装的包(模块的集合)管理工具,可以使用 npm 安装第三方模块包,第三方模块包可以在https://www.npmjs.com/找到。cnpm 是 npm 的国内替代命令,如果 npm 下载包比较慢或安装出现各种问题,可以选择使用 cnpm。

  如果服务器可以连接互联网,直接使用 npm 命令安装 node-postgres

# 先创建一个项目目录,将模块安装到这个项目目录下 [root@yum ~]# mkdir -p /enmo/app/test_nodejs # 进入项目目录在执行 npm 安装 [root@yum ~]# cd /enmo/app/test_nodejs # 在开发项目中,建议安装时加上--save,会把安装的包信息写入到package.json文件的dependencies里,可以方便找到依赖包 # 但是新版的npm不加-save也可以自动写进去,但是如果使用 cnpm 就不一定会写入了 # npm可以指定安装版本 npm install pg@8.4.0 --save [root@yum ~]# npm install pg --save [root@yum test_nodejs]# npm list test_nodejs@ /enmo/app/test_nodejs └── pg@8.7.1 [root@yum test_nodejs]# ll drwxr-xr-x 22 root root 4096 Nov 8 00:33 node_modules -rw-r--r-- 1 root root 47 Nov 8 00:33 package.json -rw-r--r-- 1 root root 13170 Nov 8 00:33 package-lock.json # 查看包的信息 [root@yum test_nodejs]# npm info pg pg@8.7.1 | MIT | deps: 7 | versions: 211 PostgreSQL client - pure javascript & libpq with the same API https://github.com/brianc/node-postgres keywords: database, libpq, pg, postgre, postgres, postgresql, rdbms dist .tarball: https://registry.npmjs.org/pg/-/pg-8.7.1.tgz .shasum: 9ea9d1ec225980c36f94e181d009ab9f4ce4c471 .integrity: sha512-7bdYcv7V6U3KAtWjpQJJBww0UEsWuh4yQ/EjNf2HeO/NnvKjpvhEIe/A/TleP6wtmSKnUnghs5A9jUoK6iDdkA== .unpackedSize: 71.5 kB dependencies: buffer-writer: 2.0.0 packet-reader: 1.0.0 pg-connection-string: ^2.5.0 pg-pool: ^3.4.1 pg-protocol: ^1.5.0 pg-types: ^2.1.0 pgpass: 1.x ... ...

  如果服务器可以连接互联网,也可以使用 cnpm 命令安装 node-postgres

# 首先安装 cnpm [root@yum ~]# npm install -g cnpm --registry=https://registry.npmmirror.com [root@yum ~]# mkdir -p /enmo/app/test_cnpm [root@yum ~]# cd /enmo/app/test_cnpm [root@yum test_cnpm]# cnpm install pg --save [root@yum test_cnpm]# cat package.json { "dependencies": { "pg": "^8.7.1" } } [root@yum test_cnpm]# cnpm list /enmo/app/test_cnpm ├── buffer-writer@2.0.0 extraneous ├── inherits@2.0.4 extraneous ├── packet-reader@1.0.0 extraneous ├── pg-connection-string@2.5.0 extraneous ├── pg-int8@1.0.1 extraneous ├── pg-pool@3.4.1 extraneous ├── pg-protocol@1.5.0 extraneous ├── pg-types@2.2.0 extraneous ├── pg@8.7.1 extraneous ├── pgpass@1.0.4 extraneous ├── postgres-array@2.0.0 extraneous ... ...

  如果服务器不能连接互联网,就得从其他服务器上将安装好的node_modules复制过来,有的说下载源码可以离线安装,半天没整明白,我从能联网的服务器复制过来也好使,网盘分享中是我打的包,有需要的可以试试,不一定好使:链接:https://pan.baidu.com/s/1xuLs6quX3Hhwcdu7xX6rZA 提取码:pphi

# 首先在可以联网的服务器上安装 node-postgres # 在可以联网的服务器上打包项目目录 [root@yum ~]# cp /enmo/app/test_nodejs /enmo/app/node-postgres-8.7.1 [root@yum ~]# cd /enmo/app [root@yum app]# tar -zcvf node-postgres-8.7.1.tar.gz node-postgres-8.7.1 # 将 node-postgres-8.7.1.tar.gz 传到不能联网的服务器上解压 [root@pgtest3 ~]# tar -zxvf /enmo/soft/node-postgres-8.7.1.tar.gz -C /enmo/app/ # mv成项目名 [root@pgtest3 ~]# mv /enmo/app/node-postgres-8.7.1 /enmo/app/nodejs_conn_pg # cd nodejs_conn_pg 创建项目脚本 [root@pgtest3 ~]# cd /enmo/app/nodejs_conn_pg [root@pgtest3 nodejs_conn_pg]# vi conn_pg.js const pg = require('pg') const ClientClass = pg.Client const pgUrl = 'postgres://postgres:postgres@192.168.58.10:5432/postgres' const client = new ClientClass(pgUrl) async function connect(client) { try { await client.connect() console.log(`Client connected.`) const {rows} = await client.query('select inet_server_addr(),pg_is_in_recovery(),current_database(),current_user') console.table(rows) await client.end() } catch(ex){ console.log("Some error" + ex) } finally { await client.end() } } connect(client) # node 执行 [root@pgtest3 nodejs_conn_pg]# node conn_pg.js Client connected. ┌─────────┬──────────────────┬───────────────────┬──────────────────┬──────────────┐ │ (index) │ inet_server_addr │ pg_is_in_recovery │ current_database │ current_user │ ├─────────┼──────────────────┼───────────────────┼──────────────────┼──────────────┤ │ 0 │ '192.168.58.10' │ false │ 'postgres' │ 'postgres' │ └─────────┴──────────────────┴───────────────────┴──────────────────┴──────────────┘

使用pool的测试

const { Pool } = require('pg') const connectionString = 'postgres://postgres:postgres@192.168.58.10:5432/postgres' const pool = new Pool({ connectionString, max: 10, idleTimeoutMillis: 30000, connectionTimeoutMillis: 2000, }) pool.on('error', (err, client) => { console.error('Unexpected error on idle client', err) process.exit(-1) }) ;(async function() { const client = await pool.connect() const { rows } = await client.query('select inet_server_addr(),pg_is_in_recovery(),current_database(),current_user') console.table(rows) client.release() })() pool.end(() => { console.log('pool has ended') })

image.png

测试超出连接池最大限制

image.png

最后修改时间:2021-11-07 23:43:15
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论