async_postgres/pg_sql

Search:
Group by:

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}")

Types

SqlQuery = object
  query*: string
  params*: seq[PgParam]
A parameterised SQL query with its bound parameters.

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 addExec(p: Pipeline; sq: SqlQuery): untyped
template addQuery(p: Pipeline; sq: SqlQuery; resultFormat: ResultFormat = rfAuto): untyped
template exec(conn: PgConnection; sq: SqlQuery; timeout: Duration = ZeroDuration): untyped
template exec(pool: PgPool; 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