Raw SQL
tsql has template APIs for edge cases:
db.expr<TResult>`...`for SQL fragments inside fluent queriesdb.raw<TResult>`...`for full statements when fluent APIs are not enough
Prefer fluent query builders for common select statements:
const rows = await db
.from("users")
.where(({ users }) => users.email.like("%@example.com", db.dialect))
.select(({ users }) => ({ id: users.id, email: users.email }))
.execute();
db.expr
const rows = await db
.from("users")
.where(({ users }) => db.expr<boolean>`lower(${users.email}) = lower(${"Alice@example.com"})`)
.select(({ users }) => ({ id: users.id }))
.execute();
This is useful for dialect functions, computed predicates, and reusable SQL snippets.
Both template APIs parameterize interpolated values.
sqlExpr
For lower-level helpers or library code:
import { sqlExpr } from "@bms/tsql";
const trueExpr = sqlExpr<boolean>("1 = 1");
sqlExpr is a direct constructor around SQL + params.