Skip to content

holdfenytolvaj/pogi

Folders and files

NameName
Last commit message
Last commit date

Latest commit

c7d2ca7 · Mar 18, 2017

History

93 Commits
Mar 18, 2017
Mar 18, 2017
Jan 23, 2017
Mar 18, 2017
Oct 11, 2016
Mar 18, 2017
Oct 5, 2016
Oct 6, 2016
Jan 23, 2017
Oct 14, 2016
Mar 13, 2017
Oct 7, 2016

Repository files navigation

pogi

What is your dream?

pogi is a wrapper over pg.js to make life easier.

  • it is not an over engineered ORM with new syntax to learn and with less functionality,
  • it is not a simple prepared statements executor with a lot of boilerplate for queries

it is somewhere in between, around the golden middle ground.

##Some of the features:

  • typescript support (async-await!) (also can generate the structure for the db)
  • transaction support
  • connection pooling
  • sql file execution
  • BYOL - bring your own logger :) (db/schema/table/query level)
  • encourage mixing jsonb and relational columns (arrays, complex types, enums etc) to get the full power!
  • named parameters for queries
  • stream support

so all the basics that you would expect in 2016.

##Install

npm install pogi --save

##Documentation (includes why+1?) here

Our experience on migrating from mongo

##Some examples to get the taste

import {PgDb} from "pogi";

let pgdb = await PgDb.connect({connectionString: "postgres://"});

let table = pgdb['test']['users']; //or pgdb.test.users if you generate the interface

let c1 = await pgdb.query(`SELECT COUNT(*) as c FROM ${table} WHERE active=:active`, {active:true});
let c2 = await table.count({active:true});
c1[0].c == c2; //true

//mix json and relational columns (e.g. enumerations)
await table.insert({name:'simply', permissions:['r','w','e'], props:{email:'[email protected]'}});

let rows;

//use the same operators as in postgre
rows = await table.find({'name ~':'Jo.*',                                  //regexp
                         'jsoncolumn @>':{'dream':{'change':'the world'}}, //contains
                         'arraycolumn @>':['up', 'down']});                //contains  

//will be transformed to "select * from test.users where id in (1,2,3)"
rows = await table.find({id:[1,2,3]});

//easy fallback 
rows = await table.findWhere('"happyWife"="happyLife" and name=:name', {name:'me'});

//convenient functions
let power = await pgdb.queryOneField('SELECT MAX(power) FROM magical.dbhandlers');
power; //>9000

//much more!

##It's not without pitfalls What is? It's just usually not written (definitely not in the front page), but see more in the docs. I wish more project would be honest about it to save a lot of hours for others. If you find more, don't hesitate to tell us!

##Contributing Ideas are welcome! To compile & test

npm run build
npm run test

node v6

npm run build_v6
npm run test_v6

##Handcrafted at www.labcup.net