GitHub - jadbox/pg-rxjs: [pg-rxjs] combining PostgreSQL and Rx for Node (original) (raw)
pg-rxjs
Install
$ npm install pg $ npm install pg-rxjs
Usage
const pg = require('pg-rxjs')
// Default config: { debug: false, noMoment: false } // 'debug' option console.logs statements that pg will execute const pool = pg.Pool('postgres://username:password@localhost/database', {...config})
pool .query('SELECT ...') .map(...) .subscribe(data => ..., err => ..., end => ...)
pg.Pool(config) .stream('SELECT ...') .map(data => ...) // runs for each row streamed from the query .subscribe(data => ..., err => ..., end => ...)
const pg = require('pg-rxjs')
const client = pg.Client('postgres://username:password@localhost/database', {...config}) const query = client.query; // methods are already bound to the client
query('SELECT ...') .subscribe(data => ..., err => ..., end => ...)
// Using Rx chaining query('SELECT $1 as count', 42). .map(result => result.rows[0].count) .flatMap(count => query('SELECT $1 as count_again', [count])) .subscribe(data => console.log( data.rows[0].count_again ))
client.end()
- Transactions (\w auto-rollback)supports only waterfall queuing
Warning: Pool.transaction has a different API that is in the works.
var transaction = client.transaction; // btw, methods do not rely on 'this' var query = client.query;
transaction([ // use the query method query('SELECT 2 as count'),
// use Rx chaining query('SELECT 1 as count') .map(x => 'success: ' + x.row[0].count)
// or use a raw string to query 'SELECT 3 as count',
// or use a fn: x is the response of the previous query x => { assert(x.rows[0].count === 3); return query('SELECT $1::int as count', [x.rows[0].count+1]) } ]) .subscribe( result => { assert.equal(result.rowCount, 1) assert.equal(result.rows[0].count, 4) }, err => assert.fail('code will auto rollback'), () => console.log('completed') )
- Input time using Moment.js
- Disable by setting opts: pg.Client(url, {noMoment: true})
- Only works with timestamps, not date fields
- Works with transactions and stream methods too
- Moment objects are auto converted to UTC (best practice)
// Use $NOW to insert a timestamp value of the current UTC time query('SELECT $NOW AS time_now').subscribe(x => ...) // .. the same as query('SELECT to_timestamp(1452819700) AS time_now')
// Use a moment object to insert a placeholder as a timestamp // Note: no need to specify the paremeter as a timestamp const m = moment(); query('SELECT 1AStimeparam,1 AS time_param, 1AStimeparam,2::int AS second_param', [m, 42]) .subscribe(result => { assert.equal(result.rows[0].time_param, m.toDate().toString()) assert.equal(result.rows[0].second_param, 42) })
License
MIT