欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Node.js連接postgreSQL并進(jìn)行數(shù)據(jù)操作

 更新時(shí)間:2016年12月18日 09:41:48   作者:zgljl2012  
自從MySQL被Oracle收購(gòu)以后,PostgreSQL逐漸成為開(kāi)源關(guān)系型數(shù)據(jù)庫(kù)的首選。這篇文章就給大家介紹了關(guān)于Node.js如何連接postgreSQL數(shù)據(jù)庫(kù),并進(jìn)行數(shù)據(jù)操作的方法,有需要的朋友們可以參考借鑒,下面來(lái)一起看看吧。

前言

PostgreSql是一個(gè)面向?qū)ο蟮年P(guān)系數(shù)據(jù)庫(kù),postgis是一個(gè)基于PostgreSql的空間數(shù)據(jù)庫(kù)插件,主要用于管理地理空間數(shù)據(jù)。因此在GIS領(lǐng)域,廣泛使用PostgreSql作為空間數(shù)據(jù)庫(kù)。

首先使用npm安裝數(shù)據(jù)庫(kù)連接模塊:

npm install --save pg 

連接池創(chuàng)建

然后代碼中引入pg模塊,并編寫(xiě)數(shù)據(jù)庫(kù)配置:

var pg = require('pg');

// 數(shù)據(jù)庫(kù)配置
var config = { 
 user:"postgres",
 database:"ghost",
 password:"123456",
 port:5432,

 // 擴(kuò)展屬性
 max:20, // 連接池最大連接數(shù)
 idleTimeoutMillis:3000, // 連接最大空閑時(shí)間 3s
}

pg模塊中有兩種數(shù)據(jù)庫(kù)連接方式,先講連接池模式,下面是創(chuàng)建連接池:

// 創(chuàng)建連接池
var pool = new pg.Pool(config); 

傳入配置后就創(chuàng)建好了連接池。

查詢數(shù)據(jù)

查詢首先創(chuàng)建好連接,然后調(diào)用api進(jìn)行查詢:

// 查詢
pool.connect(function(err, client, done) { 
 if(err) {
 return console.error('數(shù)據(jù)庫(kù)連接出錯(cuò)', err);
 }
 // 簡(jiǎn)單輸出個(gè) Hello World
 client.query('SELECT $1::varchar AS OUT', ["Hello World"], function(err, result) {
 done();// 釋放連接(將其返回給連接池)
 if(err) {
 return console.error('查詢出錯(cuò)', err);
 }
 console.log(result.rows[0].out); //output: Hello World
 });
});

輸出:

Hello World 

參數(shù)done是一個(gè)函數(shù),調(diào)用這個(gè)函數(shù)可以將關(guān)閉連接(即將連接還給連接池)。

上面的是需要寫(xiě)回調(diào)的異步查詢,可以使用ES 7中await和async(但需安裝最新版本的pg,另外,需要使用7.2以上的nodejs,最好就是用最新的nodejs)優(yōu)化代碼,如下:

// Async & Await 方式(需 node ^7.2.1,運(yùn)行時(shí)使用 node --harmony-async-await index.js)
var query = async () => { 
 // 同步創(chuàng)建連接
 var connect = await pool.connect()
 try {
 // 同步等待結(jié)果
 var res = await connect.query('SELECT $1::varchar AS OUT', ['Hello World By Async&Await'])
 console.log(res.rows[0].out) // 可以通過(guò)rows遍歷數(shù)據(jù)
 } finally {
 connect.release()
 }
}

// 異步進(jìn)行數(shù)據(jù)庫(kù)處理
query().catch(e => console.error(e.message, e.stack)); 

在升級(jí)了nodejs之后,執(zhí)行代碼的時(shí)候,需要加參數(shù)--harmony-async-await

npm --harmony-async-await index.js 

當(dāng)然,都支持到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)
 })
})

插入、修改、刪除數(shù)據(jù)

插入、修改、刪除數(shù)據(jù)和查詢的差不多

// 在表test中插入、修改、刪除數(shù)據(jù),共兩個(gè)字段 (name, age)
pool.connect().then(client=>{ 
 // insert 數(shù)據(jù)
 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=>{
 // 輸出結(jié)果,看是否插入成功
 console.log(res.rows[0])
 }).then(res=>{
 // update 數(shù)據(jù),將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=>{
 // 再輸出結(jié)果,看是否改為了21
 console.log(res.rows[0])
 }).then(res=>{
 // 刪除數(shù)據(jù)
 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=>{
 // 再輸出結(jié)果,沒(méi)數(shù)據(jù) undefined
 console.log(res.rows[0])
 })
})

上面插入、更新里代碼都沒(méi)有進(jìn)行錯(cuò)誤處理,按道理是要加的,但如果要加try...catch...的話,就太麻煩了(畢竟只是示例).

事件監(jiān)聽(tīng)

可以添加error事件方法監(jiān)聽(tīng)連接池情況

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

現(xiàn)在連接池的最大空閑時(shí)間是3s,也就是3s還沒(méi)使用連接,就釋放連接,可將這個(gè)時(shí)間設(shè)置得長(zhǎng)一些,比如30s,這就讓我們有足夠的時(shí)間關(guān)掉數(shù)據(jù)庫(kù)進(jìn)行測(cè)試(與數(shù)據(jù)庫(kù)連接一斷開(kāi),這個(gè)事件就被觸發(fā)了,生產(chǎn)環(huán)境中,可以用來(lái)寫(xiě)日志啊、發(fā)郵件短信通知什么的。。。)。

另外,還可以監(jiān)聽(tīng)acquire和connect事件,前者在連接被客戶端獲取時(shí)觸發(fā),后者在連接生成以及客戶端與數(shù)據(jù)庫(kù)交互時(shí)觸發(fā)。

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

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

不使用連接池的客戶端

不使用連接池時(shí),直接創(chuàng)建客戶端即可:

var client = new pg.Client(); 

連接池只是用來(lái)管理(緩存)連接(即客戶端)的,查詢之類的方法跟它沒(méi)關(guān)系。

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能有一定的幫助,如果有疑問(wèn)大家可以留言交流。

相關(guān)文章

  • 在Node.js中判定文件是否可執(zhí)行的方法詳解

    在Node.js中判定文件是否可執(zhí)行的方法詳解

    在進(jìn)行前端開(kāi)發(fā)時(shí),經(jīng)常需要處理各種文件權(quán)限的問(wèn)題,特別是在Node.js環(huán)境中,你可能想要判斷某個(gè)文件是否具有可執(zhí)行權(quán)限,本文將詳細(xì)介紹如何使用isexe模塊來(lái)進(jìn)行這一操作,需要的朋友可以參考下
    2024-05-05
  • node中的__filename和__dirname的使用詳解

    node中的__filename和__dirname的使用詳解

    本文主要介紹了node中的__filename和__dirname的使用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • Express框架之connect-flash詳解

    Express框架之connect-flash詳解

    本篇文章主要介紹了Express框架之connect-flash詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-05-05
  • Node.js中的HTTP?Server對(duì)象與GET、POST請(qǐng)求

    Node.js中的HTTP?Server對(duì)象與GET、POST請(qǐng)求

    這篇文章介紹了Node.js中的HTTP?Server對(duì)象與GET、POST請(qǐng)求,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • Node.js靜態(tài)服務(wù)器的實(shí)現(xiàn)方法

    Node.js靜態(tài)服務(wù)器的實(shí)現(xiàn)方法

    這篇文章主要介紹了Node.js靜態(tài)服務(wù)器的實(shí)現(xiàn)方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2018-02-02
  • linux服務(wù)器快速卸載安裝node環(huán)境(簡(jiǎn)單上手)

    linux服務(wù)器快速卸載安裝node環(huán)境(簡(jiǎn)單上手)

    這篇文章主要介紹了linux服務(wù)器快速卸載安裝node環(huán)境(簡(jiǎn)單上手),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • NodeJS 文件夾拷貝以及刪除功能

    NodeJS 文件夾拷貝以及刪除功能

    這篇文章主要介紹了NodeJS 文件夾拷貝以及刪除功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-09-09
  • 教你快速搭建Node.Js服務(wù)器的方法教程

    教你快速搭建Node.Js服務(wù)器的方法教程

    Node.js是一套用來(lái)編寫(xiě)高性能網(wǎng)絡(luò)服務(wù)器的JavaScript工具包,一系列的變化由此開(kāi)始。這篇文章主要給大家介紹了如何快速搭建Node.Js服務(wù)器的方法教程,文中介紹的非常詳細(xì),對(duì)大家具有一定的參考價(jià)值,需要的朋友下面來(lái)一起看看吧。
    2017-03-03
  • Node.js開(kāi)啟Https的實(shí)踐詳解

    Node.js開(kāi)啟Https的實(shí)踐詳解

    最近因?yàn)楣ぷ餍枰枰獙⒕W(wǎng)站切換到了https。其實(shí)去年就想遷的遷移過(guò)去,但是資金緊缺就找了個(gè)免費(fèi)的證書(shū),實(shí)際效果不是很好。但是最近騰訊云推出了免費(fèi)的ssl證書(shū)申請(qǐng)。樓主是親測(cè)有效的。下面通過(guò)本文來(lái)一起看看Node.js開(kāi)啟Https的詳細(xì)步驟吧,有需要的可以參考借鑒。
    2016-10-10
  • 從零開(kāi)始學(xué)習(xí)Node.js系列教程六:EventEmitter發(fā)送和接收事件的方法示例

    從零開(kāi)始學(xué)習(xí)Node.js系列教程六:EventEmitter發(fā)送和接收事件的方法示例

    這篇文章主要介紹了Node.js EventEmitter發(fā)送和接收事件的方法,結(jié)合實(shí)例形式分析了EventEmitter發(fā)送和接收事件的原理、實(shí)現(xiàn)方法與相關(guān)操作技巧,需要的朋友可以參考下
    2017-04-04

最新評(píng)論