SQL generator
npm install @mojojs/sql


Safely generate and compose SQL statements with tagged template literals. Written in TypeScript.
``js
import {sql} from '@mojojs/sql';
// {text: 'SELECT * FROM users WHERE name = $1', values: ['sebastian']}
const {text, values} = sqlSELECT * FROM users WHERE name = ${'sebastian'}.toQuery();`
To prevent SQL injection attacks, all interpolated values become placeholders in the generated query. Partial
statements can even be used recursively to build more complex queries.
`jsAND role = ${role}
const role = 'admin';
const partialQuery = sql;
const name = 'root';
// {text: 'SELECT * FROM users WHERE name = $1 AND role = $2', values: ['root', 'admin']}
const {text, values} = sqlSELECT * FROM users WHERE name = ${name} ${partialQuery}.toQuery();`
Make partial statements optional to dynamically generate WHERE clauses.
`jsAND foo IS NOT NULL
const optionalPart = foo === true ? sql : sql;SELECT * FROM users WHERE name = ${'sebastian'} ${optionalPart}
const {text, values} = sql.toQuery();`
And if you need a little more control over the generated SQL query, you can of course also bypass safety features with
the tagged template literal sqlUnsafe. But make sure to handle unsafe values yourself with appropriate escapingescapeLiteral
functions for your database. For PostgreSQL there are and escapeIdentifier functions included with
this package.
`js
import {sql, sqlUnsafe, escapeLiteral} from '@mojojs/sql';
const role = 'role = ' + escapeLiteral('power user');
const partialQuery = sqlUnsafeAND ${role};
const name = 'root';
// {text: "SELECT * FROM users WHERE name = $1 AND role = 'power user'", values: ['root']}
const {text, values} = sqlSELECT * FROM users WHERE name = ${name} ${partialQuery}.toQuery();`
For databases that do not support numbered placeholders like $1 and $2, you can set a custom character with theplaceholder option.
`jsSELECT * FROM users WHERE name = ${'root'}
// {text: 'SELECT * FROM users WHERE name = ?', values: ['root']}
const {text, values} = sql.toQuery({placeholder: '?'});`
All you need is Node.js 16.0.0 (or newer).
```
$ npm install @mojojs/sql
If you have any questions the documentation might not yet answer, don't hesitate to ask in the
Forum, on Matrix, or
IRC.