Node Postgres教程展示了如何在JavaScript中使用Node-postgres的PostgreSQL数据库。

The node-postgres

node-postgres是Node.js模块的集合,用于与PostgreSQL数据库接口。它支持回调、承诺、异步/等待、连接池、预准备语句、游标和流式处理结果。

在我们的示例中,我们还使用 Ramda 库。有关详细信息,请参阅 Ramda 教程。

设置 node-postgres

首先,我们安装node-postgres。

$ npm init -y

我们启动了一个新的 Node 应用程序。

$ npm i pg

我们用 .nmp i pg

$ npm i ramda

此外,我们安装了Ramda,以便对数据进行漂亮的工作。

汽车.sql
DROP TABLE IF EXISTS cars;CREATE TABLE cars(id SERIAL PRIMARY KEY, name VARCHAR(255), price INT);
INSERT INTO cars(name, price) VALUES('Audi', 52642);
INSERT INTO cars(name, price) VALUES('Mercedes', 57127);
INSERT INTO cars(name, price) VALUES('Skoda', 9000);
INSERT INTO cars(name, price) VALUES('Volvo', 29000);
INSERT INTO cars(name, price) VALUES('Bentley', 350000);
INSERT INTO cars(name, price) VALUES('Citroen', 21000);
INSERT INTO cars(name, price) VALUES('Hummer', 41400);
INSERT INTO cars(name, price) VALUES('Volkswagen', 21600);

在一些示例中,我们使用此表。cars

node-postgres 第一个示例

在第一个示例中,我们连接到 PostgreSQL 数据库并返回一个简单的 SELECT 查询结果。

第一.js
const pg = require('pg');
const R = require('ramda');const cs = 'postgres://postgres:s$cret@localhost:5432/ydb';const client = new pg.Client(cs);
client.connect();client.query('SELECT 1 + 4').then(res => {const result = R.head(R.values(R.head(res.rows)));console.log(result);
}).finally(() => client.end());

该示例连接到数据库并发出 SELECT 语句。

const pg = require('pg');
const R = require('ramda');

我们包括 和 模块。pgramda

const cs = 'postgres://postgres:s$cret@localhost:5432/ydb';

这是 PostgreSQL 连接字符串。它用于构建与数据库的连接。

const client = new pg.Client(cs);
client.connect();

将创建一个客户端。我们使用 连接到数据库。connect

client.query('SELECT 1 + 4').then(res => {const result = R.head(R.values(R.head(res.rows)));console.log(result);
}).finally(() => client.end());

我们发出一个简单的 SELECT 查询。我们获取结果并将其输出到控制台。是对象的数组;我们使用 Ramda 来获取返回的标量值。最后,我们关闭与 的连接。res.rowsend

$ node first.js
5

节点-postgres 列名

在下面的示例中,我们获取数据库的列名。

column_names.js
const pg = require('pg');const cs = 'postgres://postgres:s$cret@localhost:5432/ydb';const client = new pg.Client(cs);client.connect();client.query('SELECT * FROM cars').then(res => {const fields = res.fields.map(field => field.name);console.log(fields);}).catch(err => {console.log(err.stack);
}).finally(() => {client.end()
});

使用属性检索列名。我们还使用子句来输出潜在的错误。res.fieldscatch

$ node column_names.js
[ 'id', 'name', 'price' ]

输出显示表的三个列名。cars

选择所有行

在下一个示例中,我们从数据库表中选择所有行。

all_rows.js
const pg = require('pg');
const R = require('ramda');const cs = 'postgres://postgres:s$cret@localhost:5432/ydb';const client = new pg.Client(cs);client.connect();client.query('SELECT * FROM cars').then(res => {const data = res.rows;console.log('all data');data.forEach(row => {console.log(`Id: ${row.id} Name: ${row.name} Price: ${row.price}`);})console.log('Sorted prices:');const prices = R.pluck('price', R.sortBy(R.prop('price'), data));console.log(prices);}).finally(() => {client.end()
});

该示例输出表中的所有行和汽车价格的排序列表。cars

$ node all_rows.js
all data
Id: 1 Name: Audi Price: 52642
Id: 2 Name: Mercedes Price: 57127
Id: 3 Name: Skoda Price: 9000
Id: 4 Name: Volvo Price: 29000
Id: 5 Name: Bentley Price: 350000
Id: 6 Name: Citroen Price: 21000
Id: 7 Name: Hummer Price: 41400
Id: 8 Name: Volkswagen Price: 21600
Sorted prices:
[ 9000, 21000, 21600, 29000, 41400, 52642, 57127, 350000 ]

The node-postgres parameterized query

参数化查询使用占位符,而不是直接将值写入语句。参数化查询可提高安全性和性能。

参数化.js
const pg = require('pg');const cs = 'postgres://postgres:s$cret@localhost:5432/ydb';const client = new pg.Client(cs);client.connect();const sql = 'SELECT * FROM cars WHERE price > $1';
const values = [50000];client.query(sql, values).then(res => {const data = res.rows;data.forEach(row => console.log(row));}).finally(() => {client.end()
});

该示例在简单的 SELECT 语句中使用参数化查询。

const sql = 'SELECT * FROM cars WHERE price > $1';

这是 SELECT 查询。是一个占位符,稍后以安全的方式将其替换为值。$1

const values = [50000];

这些是要插入到参数化查询中的值。

client.query(sql, values).then(res => {

这些值将作为第二个参数传递给方法。query

$ node parameterized.js
{ id: 1, name: 'Audi', price: 52642 }
{ id: 2, name: 'Mercedes', price: 57127 }
{ id: 5, name: 'Bentley', price: 350000 }

带有异步/等待的 node-postgres

Node Postgres 支持 async/await 语法。

async_await.js
const pg = require('pg');
const R = require('ramda');const cs = 'postgres://postgres:s$cret@localhost:5432/ydb';async function fetchNow() {const client = new pg.Client(cs);try {await client.connect();let result = await client.query('SELECT now()');return R.prop('now', R.head(result.rows));} finally {client.end()}
}fetchNow().then(now => console.log(now));

该示例使用异步/等待输出查询的结果。SELECT now

$ node async_await.js
2019-02-17T11:53:01.447Z

节点-postgres 行模式

默认情况下,node-postgres 将数据作为对象数组返回。我们可以告诉node-postgres将数据作为数组返回。

row_mode.js
const pg = require('pg');
const R = require('ramda');const cs = 'postgres://postgres:s$cret@localhost:5432/ydb';const client = new pg.Client(cs);client.connect();const query = {text: 'SELECT * FROM cars',rowMode: 'array'
};client.query(query).then(res => {const data = res.rows;console.log('all data');data.forEach(row => {console.log(`Id: ${row[0]} Name: ${row[1]} Price: ${row[2]}`);})console.log('Sorted prices:');const prices = data.map(x => x[2]);const sorted = R.sort(R.comparator(R.lt), prices);console.log(sorted);}).finally(() => {client.end()
});

该示例显示表中的所有行。它启用数组行模式。cars

const query = {text: 'SELECT * FROM cars',rowMode: 'array'
};

我们使用将 设置为 的配置对象。rowModearray

console.log('all data');
data.forEach(row => {console.log(`Id: ${row[0]} Name: ${row[1]} Price: ${row[2]}`);
})

现在我们循环访问一个数组数组。

$ node row_mode.js
all data
Id: 1 Name: Audi Price: 52642
Id: 2 Name: Mercedes Price: 57127
Id: 3 Name: Skoda Price: 9000
Id: 4 Name: Volvo Price: 29000
Id: 5 Name: Bentley Price: 350000
Id: 6 Name: Citroen Price: 21000
Id: 7 Name: Hummer Price: 41400
Id: 8 Name: Volkswagen Price: 21600
Sorted prices:
[ 9000, 21000, 21600, 29000, 41400, 52642, 57127, 350000 ]

节点后聚合池示例

连接池可提高数据库应用程序的性能。它是特别有用的Web应用程序。

池化.js
const pg = require('pg');var config = {user: 'postgres',password: 's$cret',database: 'ydb'
}const pool = new pg.Pool(config);pool.connect().then(client => {return client.query('SELECT * FROM cars WHERE id = $1', [1]).then(res => {client.release();console.log(res.rows[0]);}).catch(e => {client.release();console.log(e.stack);})}).finally(() => pool.end());

该示例演示如何设置使用连接池的示例。完成查询后,我们调用该方法以将连接返回到池。client.release

}).finally(() => pool.end());

将排出所有活动客户端的池,断开它们,并关闭池中的任何内部计时器。这在诸如此示例的脚本中使用。在Web应用程序中,我们可以在Web服务器关闭时调用它,或者根本不调用它。pool.end

在本教程中,我们曾经在 Node.js 中与 PostgreSQL 进行交互。node-postgres

Node.js Postgres 教程相关推荐

  1. 24个很赞的 Node.js 免费教程和在线指南

    JavaScript 最初是用来创建动态网站效果的的前端语言.而如今,这门脚本语言也可以用作后端开发,用于搭建 Web 服务器,开发接口,甚至创建博客.在下面这个列表中包括24个 Node.js 教程 ...

  2. js读取http chunk流_极简 Node.js入门 教程双工流

    点击上方蓝字关注我们 小编提示: 本文是由 ICBU 的谦行小哥哥出品,我们会持续发出极简 Node.js入门 教程,敬请期待哦,文中有比较多的演示代码建议横屏阅读 双工流就是同时实现了 Readab ...

  3. linux安装Node.js(详细)Node.js安装教程

    linux安装Node.js(详细)Node.js安装教程 文章目录 linux安装Node.js(详细)Node.js安装教程 1:下载 2:解压 3:移动目录 1:创建目录 2:移动目录并重命名 ...

  4. Node.js安装教程(图文版)

    [前端之旅]Web基础与开发工具 [前端之旅]手把手教你安装VS Code并附上超实用插件指南 [前端之旅]HTML大总结 [前端之旅]CSS三万字总结 [前端之旅]JavaScript学习笔记 [前 ...

  5. Node.js 入门教程 23 使用 npm 的语义版本控制 24 卸载 npm 软件包 25 npm 全局或本地的软件包

    Node.js 入门教程 Node.js官方入门教程 Node.js中文网 本文仅用于学习记录,不存在任何商业用途,如侵删 文章目录 Node.js 入门教程 23 使用 npm 的语义版本控制 24 ...

  6. Node.js 入门教程 6 V8 JavaScript 引擎

    Node.js 入门教程 Node.js官方入门教程 Node.js中文网 本文仅用于学习记录,不存在任何商业用途,如侵删 文章目录 Node.js 入门教程 6 V8 JavaScript 引擎 6 ...

  7. Node.js安装教程(Windows)

    Node.js安装教程(Windows版本) 安装网址:https://nodejs.org/en/download/ 第一步 选择windows installer: 直接点击windows ins ...

  8. node.js 安装教程 (Windows zip 版)

    node.js 安装教程 (Windows zip 版) 1 官网 地址:Node.js (nodejs.org) 界面: 2 下载 地址:下载 | Node.js (nodejs.org) 自行选择 ...

  9. Node.js 初学者教程

    介绍 首先,让我们继续将Node.js下载到我们的机器上.您可以从其官方网站 ( nodejs.org ) 找到并下载 Node.进入主页后,选择您喜欢使用的版本.在下面的屏幕截图中,左侧选项 (8. ...

最新文章

  1. eltable 无数据文案修改_有哪些适合十二月发的文艺文案?记录文案用这款图片便签...
  2. python变量类型-Python 变量类型详解
  3. 按 结构记录的 相关字段 快速排序
  4. nacos 公共_Nacos 知识点
  5. 【小白的CFD之旅】22 好网格与坏网格
  6. 13.相机和图像——透镜、薄透镜_2
  7. Docker学习总结(66)—— Docker 的三大基石:Namespace、Cgroup 和 rootfs
  8. Java实现在线语音识别
  9. 自顶向下彻底理解 Java 中的 volatile 关键字
  10. Solidity函数中pure、view、constant的用法
  11. 第九届蓝桥杯国赛 调手表
  12. java 熄灯问题_C++基础算法学习——熄灯问题
  13. 闲鱼网站实时监控iphone最新发布信息
  14. 微信支付-此商家的收款功能已被限制,暂无法支付(解决方案)
  15. 教你免费下载和安装office办公软件,超级简单
  16. 打击恶意逃废债 捞财宝响应互金整治办报送“老赖”信息
  17. div css教程 属性,Div+CSS布局入门教程
  18. 时隔二十年,C++又杀回来了!
  19. MFC学习笔记之三(粒子系统+怪物简单AI+碰撞检测)
  20. 有道云笔记突然出现乱码 日记变成乱码

热门文章

  1. 项目经理7大步骤轻松跟进项目,让你带项目不再那么累
  2. 软件工程-集成测试和确认测试
  3. 九江中专学校计算机,九江科技中专学校
  4. 什么是 window 对象?什么是 document 对象?
  5. pomelo配置logger时日志无法输出到日志文件的问题解决方案
  6. wpf 自定义combox控件
  7. VCS+Verdi联合仿真教程
  8. NLP:词袋模型(bag of words)、词向量模型(Word Embedding)
  9. 日志类Logger的基本使用
  10. 窗口置顶器 TopWindow