Build a { text, values } object for use with brianc/node-postgres. Supports nesting.
Write the query as-is inside template literals, use ${}
interpolation to
supply values.
var SQL = require("pg-template-tag");
connection.query(SQL`select name from user where id=${id}`);
connection.query(SQL`select value from record where ${ lower===null ? SQL`true` : SQL`time > ${lower}`}`);
Pieces are reusable, so you can:
var fields = SQL`name, time, score, history_avg(score) as "scoreAvg"`;
connection.query(SQL`select ${fields} from scores where time > current_date`);
connection.query(SQL`select ${fields} from scores where score > ${minScore}`);
There's a .join
function analog to Array.prototype.join
to join together literals.
function filterUsers(filter) {
var conditions = [];
if (filter.email) conditions.push(SQL`email like ${filter.email}`);
if (filter.minAge) conditions.push(SQL`age > ${filter.minAge}`);
if (filter.maxAge) conditions.push(SQL`age < ${filter.maxAge}`);
return connection.query(SQL`select * from users where ${SQL.join(conditions, ' and ')}`);
}