Postgre-SQLPostgreSQL 數(shù)據(jù)庫操作庫
Postgre-SQL
一個用于node.js上的,基于pg/pg-native/pg-pool的一個PostgreSQL數(shù)據(jù)庫操作庫。
設(shè)計(jì)目標(biāo)是:用更少的代碼,寫出更直觀的(復(fù)雜)查詢。
比如:
* await db.table(table).add(data). 在insert into 之后,自動檢測是否有主鍵,主鍵是否是序列,如果是,返回ID。否則返回影響的行數(shù)。如果`table`表中有`create_at`字段,會自動填充`NOW()`。
* await db.table(table).where(condition).find(). 自動在SQL中追加`limit 1`,并返回rows[0]或null。
* await db.table(table).where(condition).getField(field). 自動在SQL中追加`limit 1`,并返回rows[0][field]或null。
使用類似ThinkPHP的語法,去操作PostgreSQL數(shù)據(jù)庫。
> 可來這里https://runkit.com/blusewang/postgre-sql-play先過手癮。
庫本身已經(jīng)包含了連接池功能。所以可以直接連接PostgreSQL不必經(jīng)過pgbouncer。
可以在業(yè)務(wù)里按需要在三個不同的級別自由切換。更靈活更高效。
有了連接池可以很好的避免因?yàn)閚ode.js過載產(chǎn)生的連鎖反應(yīng),波及到PostgreSQL數(shù)據(jù)庫。
安裝
npm i postgre-sql
配置
const {connect} = require('postgre-sql');
connect({user:'postgres',database:'test',max:2,idleTimeoutMillis:100});
使用DEMO
const {client} = require('postgre-sql');
let db = new client();
(async ()=>{
try{
let res = await db.table('public.users')
.where({vip:true},"create_at>'2017-01-01' and coordinate <-> point(116,39) < 1")
.field('uid,user_name').order('uid desc').page(2).select();
// res -> [{uid:34,use_name:'alice'},{uid:35,user_name:'david'}...]
}catch (e){
// something else
}
try{
await db.begin();
let new_uid = await db.table('public.users').add({user_name:'charles'});
await db.commit();
}catch (e){
db.rollback();
}
})();
會話模式
默認(rèn)是statement模式,這個模式的語句會平均負(fù)載到池中所有的連接。適合并行查詢!
會話模式會根據(jù)業(yè)務(wù)自動調(diào)整。
語句模式 statement
const {client} = require('postgre-sql');
let db = new client();
(async ()=>{
try{
let res = await db.table('public.users')
.where({vip:true},"create_at>'2017-01-01' and coordinate <-> point(116,39) < 1")
.field('uid,user_name').order('uid desc').page(2).select();
// res -> [{uid:34,use_name:'alice'},{uid:35,user_name:'david'}...]
}catch (e){
// something else
}
})();
會話模式 session
const {client} = require('postgre-sql');
let db = new client();
(async ()=>{
try{
await db.connect();
let res = await db.table('public.users')
.where({vip:true},"create_at>'2017-01-01' and coordinate <-> point(116,39) < 1")
.field('uid,user_name').order('uid desc').page(2).select();
// res -> [{uid:34,use_name:'alice'},{uid:35,user_name:'david'}...]
await db.release(); // Attention! if connection a session don't forget release it!
}catch (e){
await db.release(); // Attention! if connection a session don't forget release it!
// something else
}
})();
事務(wù)模式 transaction
const {client} = require('postgre-sql');
let db = new client();
(async ()=>{
try{
await db.begin();
let new_uid = await db.table('public.users').add({user_name:'charles'});
await db.commit(); // Attention! if start a transaction don't forget finish it!
}catch (e){
db.rollback(); // Attention! if start a transaction don't forget finish it!
}
})();
自動完成
如果表中有create_at、update_at、delete_at。在CUD的操作中會自動填充NOW()。
軟刪除只在db.table(tableName).where(conditions).delete();時影響結(jié)果。
在SELECT類型的語句中,不會主動識,別并剔除delete_at非空的記錄。需要手動寫在conditions中。
更多姿勢,見:https://github.com/blusewang/postgre-sql/blob/master/test/main.test.js
