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/
环境准备
- 下载安装 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
- 下载安装 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')
})
测试超出连接池最大限制