Node.js连接postgreSQL并进行数据操作


Posted in Javascript onDecember 18, 2016

前言

PostgreSql是一个面向对象的关系数据库,postgis是一个基于PostgreSql的空间数据库插件,主要用于管理地理空间数据。因此在GIS领域,广泛使用PostgreSql作为空间数据库。

首先使用npm安装数据库连接模块:

npm install --save pg

连接池创建

然后代码中引入pg模块,并编写数据库配置:

var pg = require('pg');

// 数据库配置
var config = { 
 user:"postgres",
 database:"ghost",
 password:"123456",
 port:5432,

 // 扩展属性
 max:20, // 连接池最大连接数
 idleTimeoutMillis:3000, // 连接最大空闲时间 3s
}

pg模块中有两种数据库连接方式,先讲连接池模式,下面是创建连接池:

// 创建连接池
var pool = new pg.Pool(config);

传入配置后就创建好了连接池。

查询数据

查询首先创建好连接,然后调用api进行查询:

// 查询
pool.connect(function(err, client, done) { 
 if(err) {
 return console.error('数据库连接出错', err);
 }
 // 简单输出个 Hello World
 client.query('SELECT $1::varchar AS OUT', ["Hello World"], function(err, result) {
 done();// 释放连接(将其返回给连接池)
 if(err) {
 return console.error('查询出错', err);
 }
 console.log(result.rows[0].out); //output: Hello World
 });
});

输出:

Hello World

参数done是一个函数,调用这个函数可以将关闭连接(即将连接还给连接池)。

上面的是需要写回调的异步查询,可以使用ES 7中await和async(但需安装最新版本的pg,另外,需要使用7.2以上的nodejs,最好就是用最新的nodejs)优化代码,如下:

// Async & Await 方式(需 node ^7.2.1,运行时使用 node --harmony-async-await index.js)
var query = async () => { 
 // 同步创建连接
 var connect = await pool.connect()
 try {
 // 同步等待结果
 var res = await connect.query('SELECT $1::varchar AS OUT', ['Hello World By Async&Await'])
 console.log(res.rows[0].out) // 可以通过rows遍历数据
 } finally {
 connect.release()
 }
}

// 异步进行数据库处理
query().catch(e => console.error(e.message, e.stack));

在升级了nodejs之后,执行代码的时候,需要加参数--harmony-async-await

npm --harmony-async-await index.js

当然,都支持到ES7了,ES6的Promise方法肯定是支持的,如下:

pool.connect().then(client=>{ 
 client.query('SELECT $1::varchar AS OUT', ['Hello World By Promise']).then(res=>{
 client.release()
 console.log(res.rows[0].out)
 }).catch(e => {
 client.release()
 console.error('query error', e.message, e.stack)
 })
})

插入、修改、删除数据

插入、修改、删除数据和查询的差不多

// 在表test中插入、修改、删除数据,共两个字段 (name, age)
pool.connect().then(client=>{ 
 // insert 数据
 client.query("INSERT INTO test(name, age) VALUES($1::varchar, $2::int)", ["xiaoming","20"]).then(res=>{
 console.log("Insert Success")
 // 如果是自增ID,有返回值的,在res里
 return res;
 }).then(res=>{
 // 查询xiaoming
 return client.query("Select * FROM test WHERE name = $1", ["xiaoming"]);
 }).then(res=>{
 // 输出结果,看是否插入成功
 console.log(res.rows[0])
 }).then(res=>{
 // update 数据,将age改为21
 return client.query("UPDATE test SET age=$1 WHERE name=$2", [21, "xiaoming"])
 }).then(res=>{
 // 再查询一次xiaoming
 return client.query("Select * FROM test WHERE name = $1", ["xiaoming"]);
 }).then(res=>{
 // 再输出结果,看是否改为了21
 console.log(res.rows[0])
 }).then(res=>{
 // 删除数据
 client.query("DELETE FROM test WHERE name=$1", ["xiaoming"])
 }).then(res=>{
 // 最后再查询一次xiaoming
 res = client.query("Select * FROM test WHERE name = $1", ["xiaoming"]);
 // 释放连接
 client.release()
 return res
 }).then(res=>{
 // 再输出结果,没数据 undefined
 console.log(res.rows[0])
 })
})

上面插入、更新里代码都没有进行错误处理,按道理是要加的,但如果要加try...catch...的话,就太麻烦了(毕竟只是示例).

事件监听

可以添加error事件方法监听连接池情况

pool.on("error", function(err, client){ 
 console.log("error --> ", err)
})

现在连接池的最大空闲时间是3s,也就是3s还没使用连接,就释放连接,可将这个时间设置得长一些,比如30s,这就让我们有足够的时间关掉数据库进行测试(与数据库连接一断开,这个事件就被触发了,生产环境中,可以用来写日志啊、发邮件短信通知什么的。。。)。

另外,还可以监听acquire和connect事件,前者在连接被客户端获取时触发,后者在连接生成以及客户端与数据库交互时触发。

pool.on('acquire', function (client) { 
 console.log("acquire Event")
})

pool.on('connect', function () { 
 console.log("connect Event")
})

不使用连接池的客户端

不使用连接池时,直接创建客户端即可:

var client = new pg.Client();

连接池只是用来管理(缓存)连接(即客户端)的,查询之类的方法跟它没关系。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能有一定的帮助,如果有疑问大家可以留言交流。

Javascript 相关文章推荐
javascript编程起步(第二课)
Jan 10 Javascript
JQuery在光标位置插入内容的实现代码
Jun 18 Javascript
Jquery 复选框取值兼容FF和IE8(测试有效)
Oct 29 Javascript
BootStrap智能表单实战系列(四)表单布局介绍
Jun 13 Javascript
使用微信小程序开发前端【快速入门】
Dec 05 Javascript
JS小数转换为整数的方法分析
Jan 07 Javascript
微信小程序上传图片功能(附后端代码)
Jun 19 Javascript
JS实现图片转换成base64的各种应用场景实例分析
Jun 22 Javascript
vue移动端下拉刷新和上拉加载的实现代码
Sep 08 Javascript
详解在React项目中安装并使用Less(用法总结)
Mar 18 Javascript
深入解析Vue源码实例挂载与编译流程实现思路详解
May 05 Javascript
Vue实现动态查询规则生成组件
May 27 Vue.js
纯js实现悬浮按钮组件
Dec 17 #Javascript
Jquery Easyui搜索框组件SearchBox使用详解(19)
Dec 17 #Javascript
Bootstrap CSS组件之按钮下拉菜单
Dec 17 #Javascript
谈谈JS中常遇到的浏览器兼容问题和解决方法
Dec 17 #Javascript
Bootstrap CSS组件之按钮组(btn-group)
Dec 17 #Javascript
谈谈JavaScript中浏览器兼容问题的写法小议
Dec 17 #Javascript
Bootstrap CSS组件之下拉菜单(dropdown)
Dec 17 #Javascript
You might like
php中使用preg_replace函数匹配图片并加上链接的方法
2013/02/06 PHP
使用图灵api创建微信聊天机器人
2015/07/23 PHP
给大家分享几个常用的PHP函数
2017/01/15 PHP
老生常谈PHP面向对象之命令模式(必看篇)
2017/05/24 PHP
PHP API接口必备之输出json格式数据示例代码
2017/06/27 PHP
PHP实现的MD5结合RSA签名算法实例
2017/10/07 PHP
WordPress伪静态规则设置代码实例
2020/12/10 PHP
用最通俗易懂的代码帮助新手理解javascript闭包 推荐
2012/03/01 Javascript
JavaScript中的console.trace()函数介绍
2014/12/29 Javascript
JavaScript中的函数声明和函数表达式区别浅析
2015/03/27 Javascript
WEB前端开发框架Bootstrap3 VS Foundation5
2016/05/16 Javascript
详解PHP中pathinfo()函数导致的安全问题
2017/01/05 Javascript
node实现定时发送邮件的示例代码
2017/08/26 Javascript
微信小程序scroll-view组件实现滚动动画
2018/01/31 Javascript
JavaScript 有用的代码片段和 trick
2018/02/22 Javascript
一次记住JavaScript的6个正则表达式方法
2018/02/22 Javascript
微信小程序自定义组件之可清除的input组件
2018/07/17 Javascript
在vue项目中集成graphql(vue-ApolloClient)
2018/09/08 Javascript
Vue2.0实现简单分页及跳转效果
2019/07/29 Javascript
Element Input输入框的使用方法
2020/07/26 Javascript
js实现点击选项置顶动画效果
2020/08/25 Javascript
[06:45]DOTA2卡尔工作室 英雄介绍幻影长矛手篇
2013/07/12 DOTA
[02:33]DOTA2亚洲邀请赛趣味视频之吐真话筒
2018/03/31 DOTA
python实现查找excel里某一列重复数据并且剔除后打印的方法
2015/05/26 Python
在Python的Django框架中为代码添加注释的方法
2015/07/16 Python
python利用JMeter测试Tornado的多线程
2020/01/12 Python
Python如何将字符串转换为日期
2020/07/31 Python
python实现控制台输出颜色
2021/03/02 Python
海淘母婴商城:国际妈咪
2016/07/23 全球购物
捷克钓鱼用品网上商店:Parys.cz
2018/06/15 全球购物
英国顶级水晶珠宝零售商之一:Tresor Paris
2019/04/27 全球购物
委托与事件是什么关系?为什么要使用委托
2014/04/18 面试题
公安四风对照检查材料思想汇报
2014/10/11 职场文书
2016年寒假社会实践活动总结
2015/03/27 职场文书
医院岗前培训心得体会
2016/01/08 职场文书
导游词之海南-南湾猴岛
2019/10/12 职场文书