sql
sql.identifier
sql.values
sql.raw
sql.default
sql.append
toSQL
stream
chunked
sql.append lets you conveniently append SQL templates:
const query = sql`select * from users where id = 10`; query.append(sql` or id = 20`); const result = await query;
select * from users where id = 10 or id = 20;
It is an extremely useful API to build dynamic queries:
type Filter = { key: string, operator: "=" | "!=", value: string, } const listItems = async (params: {limit: number, offset?: number, filter?: Filter }) => { const query = sql`select * from items`; if(filter) { query.append(sql` where ${sql.identifier(it.key)} ${sql.raw(it.operator)} ${it.value}`) } query.append(sql` limit ${params.limit}`); if(params.offset) { query.append(sql` offset ${params.offset}`); } } await listItems({ limit: 50 }); await listItems({ limit: 50, filter: { key: "name", operator: "=", value: "Item 1"}}); await listItems({ limit: 50, offset: 50, filter: { key: "name", operator: "=", value: "Item 1"}});
select * from items limit $1; -- [50] params select * from items where "name" = $1 limit $2; -- ["Item 1", 50] params select * from items where "name" = $1 limit $2 offset $3; -- ["Item 1", 50, 50] params