SQL query helpers: ?-placeholder conversion and sql string-literal macro.
sqlParams converts ?-style placeholders (compatible with Nim's db_connector) to PostgreSQL's $1, $2, ... positional format. This lets you combine std/strformat with parameterised queries:
import std/strformat await conn.query(fmt"SELECT * FROM {tbl} WHERE age > ? LIMIT {n}".sqlParams, pgParams(minAge))
The sql string-literal macro extracts {expr} placeholders at compile time, producing a SqlQuery that bundles the rewritten SQL and its parameters:
await conn.query(sql"SELECT * FROM users WHERE age > {minAge} AND name = {name}")
Procs
func sqlParams(sql: string): string {....raises: [], tags: [], forbids: [].}
-
Convert ?-style placeholders to PostgreSQL $1, $2, … positional placeholders.
- ?? is an escape for a literal ?
- ?| and ?& (PostgreSQL JSONB operators) are preserved
- ? inside single-quoted SQL strings is preserved
- ? inside E'…' C-style escape strings is preserved
- ? inside double-quoted identifiers is preserved
- ? inside dollar-quoted strings ($$…$$, $tag$…$tag$) is preserved
Macros
macro sql(queryStr: static[string]): untyped
-
Compile-time macro that parses {expr} placeholders in a SQL string literal, replacing them with $1, $2, … and collecting the expressions as PgParam values.
Use {{ and }} to produce literal braces. Placeholders inside single-quoted SQL strings, E'…' strings, double-quoted identifiers, and dollar-quoted strings are left as-is.
Templates
template addQuery(p: Pipeline; sq: SqlQuery; resultFormat: ResultFormat = rfAuto): untyped
template exec(conn: PgConnection; sq: SqlQuery; timeout: Duration = ZeroDuration): untyped
template execInTransaction(conn: PgConnection; sq: SqlQuery; timeout: Duration = ZeroDuration): untyped
template execInTransaction(conn: PgConnection; sq: SqlQuery; opts: TransactionOptions; timeout: Duration = ZeroDuration): untyped
template execInTransaction(pool: PgPool; sq: SqlQuery; timeout: Duration = ZeroDuration): untyped
template query(conn: PgConnection; sq: SqlQuery; resultFormat: ResultFormat = rfAuto; timeout: Duration = ZeroDuration): untyped
template query(pool: PgPool; sq: SqlQuery; resultFormat: ResultFormat = rfAuto; timeout: Duration = ZeroDuration): untyped
template queryColumn(conn: PgConnection; sq: SqlQuery; timeout: Duration = ZeroDuration): untyped
template queryColumn(pool: PgPool; sq: SqlQuery; timeout: Duration = ZeroDuration): untyped
template queryEach(conn: PgConnection; sq: SqlQuery; callback: RowCallback; resultFormat: ResultFormat = rfAuto; timeout: Duration = ZeroDuration): untyped
template queryEach(pool: PgPool; sq: SqlQuery; callback: RowCallback; resultFormat: ResultFormat = rfAuto; timeout: Duration = ZeroDuration): untyped
template queryExists(conn: PgConnection; sq: SqlQuery; timeout: Duration = ZeroDuration): untyped
template queryExists(pool: PgPool; sq: SqlQuery; timeout: Duration = ZeroDuration): untyped
template queryInTransaction(conn: PgConnection; sq: SqlQuery; resultFormat: ResultFormat = rfAuto; timeout: Duration = ZeroDuration): untyped
template queryInTransaction(conn: PgConnection; sq: SqlQuery; opts: TransactionOptions; resultFormat: ResultFormat = rfAuto; timeout: Duration = ZeroDuration): untyped
template queryInTransaction(pool: PgPool; sq: SqlQuery; resultFormat: ResultFormat = rfAuto; timeout: Duration = ZeroDuration): untyped
template queryOne(conn: PgConnection; sq: SqlQuery; resultFormat: ResultFormat = rfAuto; timeout: Duration = ZeroDuration): untyped
template queryOne(pool: PgPool; sq: SqlQuery; resultFormat: ResultFormat = rfAuto; timeout: Duration = ZeroDuration): untyped
template queryValue(conn: PgConnection; sq: SqlQuery; timeout: Duration = ZeroDuration): untyped
template queryValue(pool: PgPool; sq: SqlQuery; timeout: Duration = ZeroDuration): untyped
template queryValue[T](conn: PgConnection; _: typedesc[T]; sq: SqlQuery; timeout: Duration = ZeroDuration): untyped
template queryValue[T](pool: PgPool; _: typedesc[T]; sq: SqlQuery; timeout: Duration = ZeroDuration): untyped
template queryValueOpt(conn: PgConnection; sq: SqlQuery; timeout: Duration = ZeroDuration): untyped
template queryValueOpt(pool: PgPool; sq: SqlQuery; timeout: Duration = ZeroDuration): untyped
template queryValueOpt[T](conn: PgConnection; _: typedesc[T]; sq: SqlQuery; timeout: Duration = ZeroDuration): untyped
template queryValueOpt[T](pool: PgPool; _: typedesc[T]; sq: SqlQuery; timeout: Duration = ZeroDuration): untyped
template queryValueOrDefault(conn: PgConnection; sq: SqlQuery; default: string = ""; timeout: Duration = ZeroDuration): untyped
template queryValueOrDefault(pool: PgPool; sq: SqlQuery; default: string = ""; timeout: Duration = ZeroDuration): untyped
template queryValueOrDefault[T](conn: PgConnection; _: typedesc[T]; sq: SqlQuery; default: T; timeout: Duration = ZeroDuration): untyped
template queryValueOrDefault[T](pool: PgPool; _: typedesc[T]; sq: SqlQuery; default: T; timeout: Duration = ZeroDuration): untyped
template readQuery(cluster: PgPoolCluster; sq: SqlQuery; resultFormat: ResultFormat = rfAuto; timeout: Duration = ZeroDuration): untyped
template readQueryColumn(cluster: PgPoolCluster; sq: SqlQuery; timeout: Duration = ZeroDuration): untyped
template readQueryEach(cluster: PgPoolCluster; sq: SqlQuery; callback: RowCallback; resultFormat: ResultFormat = rfAuto; timeout: Duration = ZeroDuration): untyped
template readQueryExists(cluster: PgPoolCluster; sq: SqlQuery; timeout: Duration = ZeroDuration): untyped
template readQueryOne(cluster: PgPoolCluster; sq: SqlQuery; resultFormat: ResultFormat = rfAuto; timeout: Duration = ZeroDuration): untyped
template readQueryValue(cluster: PgPoolCluster; sq: SqlQuery; timeout: Duration = ZeroDuration): untyped
template readQueryValue[T](cluster: PgPoolCluster; _: typedesc[T]; sq: SqlQuery; timeout: Duration = ZeroDuration): untyped
template readQueryValueOpt(cluster: PgPoolCluster; sq: SqlQuery; timeout: Duration = ZeroDuration): untyped
template readQueryValueOpt[T](cluster: PgPoolCluster; _: typedesc[T]; sq: SqlQuery; timeout: Duration = ZeroDuration): untyped
template readQueryValueOrDefault(cluster: PgPoolCluster; sq: SqlQuery; default: string = ""; timeout: Duration = ZeroDuration): untyped
template readQueryValueOrDefault[T](cluster: PgPoolCluster; _: typedesc[T]; sq: SqlQuery; default: T; timeout: Duration = ZeroDuration): untyped
template writeExec(cluster: PgPoolCluster; sq: SqlQuery; timeout: Duration = ZeroDuration): untyped
template writeExecInTransaction(cluster: PgPoolCluster; sq: SqlQuery; timeout: Duration = ZeroDuration): untyped
template writeQuery(cluster: PgPoolCluster; sq: SqlQuery; resultFormat: ResultFormat = rfAuto; timeout: Duration = ZeroDuration): untyped
template writeQueryColumn(cluster: PgPoolCluster; sq: SqlQuery; timeout: Duration = ZeroDuration): untyped
template writeQueryEach(cluster: PgPoolCluster; sq: SqlQuery; callback: RowCallback; resultFormat: ResultFormat = rfAuto; timeout: Duration = ZeroDuration): untyped
template writeQueryExists(cluster: PgPoolCluster; sq: SqlQuery; timeout: Duration = ZeroDuration): untyped
template writeQueryInTransaction(cluster: PgPoolCluster; sq: SqlQuery; resultFormat: ResultFormat = rfAuto; timeout: Duration = ZeroDuration): untyped
template writeQueryOne(cluster: PgPoolCluster; sq: SqlQuery; resultFormat: ResultFormat = rfAuto; timeout: Duration = ZeroDuration): untyped
template writeQueryValue(cluster: PgPoolCluster; sq: SqlQuery; timeout: Duration = ZeroDuration): untyped
template writeQueryValue[T](cluster: PgPoolCluster; _: typedesc[T]; sq: SqlQuery; timeout: Duration = ZeroDuration): untyped
template writeQueryValueOpt(cluster: PgPoolCluster; sq: SqlQuery; timeout: Duration = ZeroDuration): untyped
template writeQueryValueOpt[T](cluster: PgPoolCluster; _: typedesc[T]; sq: SqlQuery; timeout: Duration = ZeroDuration): untyped
template writeQueryValueOrDefault(cluster: PgPoolCluster; sq: SqlQuery; default: string = ""; timeout: Duration = ZeroDuration): untyped
template writeQueryValueOrDefault[T](cluster: PgPoolCluster; _: typedesc[T]; sq: SqlQuery; default: T; timeout: Duration = ZeroDuration): untyped