Skip to content
/ pg-rxjs Public
forked from joaosp/pg-then

[pg-rxjs] combining PostgreSQL and Rx for Node

Notifications You must be signed in to change notification settings

jadbox/pg-rxjs

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

88 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

NPM version Build status Test coverage License Dependency status

pg-rxjs

  • Use postgresql with Rx api, based on pg.
  • Based on pg-then using Rx and adding transaction support

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 $1 AS time_param, $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

About

[pg-rxjs] combining PostgreSQL and Rx for Node

Resources

Stars

Watchers

Forks

Packages

No packages published

Languages

  • JavaScript 100.0%