Skip to content

Examples ​

This section provides hands-on examples demonstrating NpgsqlRest features. Each example builds on the previous one, progressively introducing more advanced concepts.

New to NpgsqlRest? Start with the SQL File examples — they're the recommended way to build endpoints and don't require any PostgreSQL function definitions.

All examples are available in the examples repository on GitHub.

Prerequisites ​

Before running the examples, ensure you have:

  • PostgreSQL running locally (port 5432)
  • Bun runtime installed (bun.sh)
  • A database named example_db with default credentials (postgres/postgres)

Getting Started ​

  1. Clone the repository:
bash
bash
git clone https://github.com/NpgsqlRest/npgsqlrest-docs.git
cd npgsqlrest-docs/examples
  1. Install dependencies (downloads the NpgsqlRest binary and sets up required tools):
bash
bash
bun install
  1. Navigate to any example directory and run it:
bash
bash
cd 1_my_first_function

# Apply database migrations
bun run db:up

# Start the server (also rebuilds TypeScript and HTTP files)
bun run dev
  1. Visit http://127.0.0.1:8080 to see the result.

Available Examples ​

Function-Based Examples (RoutineSource) ​

These examples use PostgreSQL functions and procedures as the endpoint source:

ExampleDescriptionRelated Blog Post
1_my_first_functionThe basics: creating a PostgreSQL function and exposing it as an HTTP endpoint with automatic TypeScript client generationEnd-to-End Type Checking
2_static_type_checkingHow NpgsqlRest's autogenerated client code provides static type safety, catching breaking changes at build timeEnd-to-End Type Checking
3_security_and_authDatabase-level security with cookie-based authentication and the principle of least privilegeDatabase-Level Security
4_passwords_tokens_rolesPassword verification, JWT/Bearer tokens, role-based access control (RBAC), and external OAuth providersMultiple Auth Schemes & RBAC
5_csv_basic_authCSV exports with HTTP Basic Auth, Excel integration, and type composition for BI use casesPostgreSQL BI Server
6_image_uploadsSecure image uploads with file system storage, PostgreSQL Large Objects, and progress trackingSecure Image Uploads
7_csv_excel_uploadsCSV and Excel file ingestion with row-by-row processing and automatic TypeScript clientsCSV & Excel Ingestion
8_simple_chat_clientReal-time chat application using Server-Sent Events (SSE) and PostgreSQL RAISE statementsReal-Time Chat with SSE
9_http_callsExternal API calls from PostgreSQL using HTTP custom types defined in type commentsExternal API Calls
10_proxy_ai_serviceReverse proxy with transform mode for caching AI responses and external service integrationReverse Proxy & AI Service
12_custom_typesCustom PostgreSQL composite types and multiset returns for complex nested JSON responsesCustom Types & Multiset
13_passkeyWebAuthn passkey authentication with pure SQL: passwordless login using device biometricsPasskey SQL Auth
14_table_formatExcel export and stats endpoints with HTML table format output and cookie authenticationExcel Exports Done Right
16_scrap_demoWeb scraping in SQL: fetch a product listing with an HTTP Custom Type, parse the HTML with PostgreSQL XPath, and return the best-value laptop by a weighted scoreWeb Scraping with HTTP Types
17_scrap_demo_2Web scraping in SQL: fetch a book catalog with an HTTP Custom Type, parse it with XML functions, and return the average book price on the pageWeb Scraping with HTTP Types
18_scrap_proxy_demo v3.18.2Combine an HTTP Custom Type with a reverse proxy: fetch the page server-side, then @proxy the scraped HTML to an upstream service in the request body via @body_parameter_name. OmitAutomaticParameters keeps the generated client a clean no-argument callWeb Scraping with HTTP Types

SQL File Examples (SqlFileSource) v3.12.0 ​

These examples use the SQL File Source plugin — endpoints are generated directly from .sql files without needing PostgreSQL functions. Each is the SQL File equivalent of the function-based example above:

ExampleDescriptionFunction-Based Equivalent
1_my_first_function_sql_fileThe basics: creating an endpoint from a .sql file with automatic TypeScript client generation1_my_first_function
2_static_type_checking_sql_fileStatic type safety with SQL File Source — catching breaking changes at build time2_static_type_checking
3_security_and_auth_sql_fileDatabase-level security with cookie-based authentication using SQL files3_security_and_auth
4_passwords_tokens_roles_sql_filePassword verification, JWT/Bearer tokens, and RBAC using SQL files4_passwords_tokens_roles
5_csv_basic_auth_sql_fileCSV exports with HTTP Basic Auth using SQL files5_csv_basic_auth
6_image_uploads_sql_fileSecure image uploads with file system storage and Large Objects using SQL files6_image_uploads
7_csv_excel_uploads_sql_fileCSV and Excel file ingestion with row-by-row processing using SQL files7_csv_excel_uploads
8_simple_chat_client_sql_fileReal-time chat application using SSE and SQL files8_simple_chat_client
9_http_calls_sql_fileExternal API calls from PostgreSQL using SQL files9_http_calls
10_proxy_ai_service_sql_fileReverse proxy with AI response caching using SQL files10_proxy_ai_service
12_custom_types_sql_fileCustom composite types and nested JSON responses using SQL files12_custom_types
14_table_format_sql_fileExcel export and stats endpoints with HTML table format using SQL files14_table_format

MCP Server (SqlFileSource) v3.17.0 ​

Expose your .sql files as Model Context Protocol tools that an AI agent can discover and call — one source, two interfaces (REST + MCP).

ExampleDescriptionRelated Blog Post
15_mcp_serverAn "Acme Store" MCP server: each .sql file is both a typed REST endpoint and an @mcp tool. Includes a dual-panel web page (REST storefront + live MCP browser), a real Claude agent driving the store, MCP-only tools, and per-tool authorizationPostgreSQL as MCP Tools

SQL Test Runner v3.19.0 ​

Test endpoints with plain .sql files using the built-in SQL test runner (npgsqlrest --test) — in-process endpoint invocation, transactional isolation, test databases, and endpoint coverage. Run with bun run test (or bun run test-watch) inside each example.

ExampleDescription
19_testing_basicThe basics: co-located layout (app.sql next to app.test.sql), boolean-SELECT and DO-block assertions, HTTP blocks with the _response table, multi-step scenario files
20_testing_newdbA fresh test database per run: named Setup/Teardown steps (create database on an admin connection + migrations), {rnd5} unique names, one test per file, authorization + user parameters, a tag taxonomy (smoke/auth/fixtures/login), deferrable-constraint fixtures — and the login.sql endpoint uses named parameters (:email, :password)
21_testing_isolationPerfect per-test isolation via a template database: migrations run once into a template, the shared run database and two per-test clones are created from it, deterministic sequence ids proven in parallel clones, a shared annotation profile attached with \ir carrying @setup/@teardown/@connection/@tag

Client Code Generation v3.20.0 ​

Typed clients beyond plain TypeScript fetch modules — a Dart client for Flutter and TanStack Query (React Query) hooks generated alongside the TypeScript client.

ExampleDescriptionDocs
22_dart_clientGenerate a typed Dart client for Flutter with the NpgsqlRest.DartClient plugin: request/response model classes with fromJson/toJson, ApiResult<T>/ApiError status wrappers, and plain package:http calls — three endpoint shapes (query-string GET with a database default, URL path parameter + @single, JSON-body POST) plus MockClient testabilityDart Code Generation
23_react_query_hooksGenerate TanStack Query v5 hooks alongside the TypeScript client (ClientCodeGen.ReactQuery): useQuery/useMutation hooks with exported query-key factories and QueryKeyPrefix, types derived from the client functions, a @tsclient_hooks = off opt-out, and explicit cache invalidation through the key factories in a consumer componentReact Query Hooks

Available Commands ​

Each example provides these scripts:

CommandDescription
bun run devStart NpgsqlRest server (rebuilds TypeScript and HTTP files)
bun run buildCompile TypeScript to JavaScript
bun run watchWatch mode for TypeScript changes
bun run db:upApply database migrations
bun run db:listList pending migrations

Next Steps ​

After completing these examples, explore:

Comments