Skip to main content

Query your app’s database with “db”

ctx.db.query lets a task run SQL directly against your Compose app’s database. In the cloud this is the hosted Postgres database that backs your app; in local dev it is the local SQLite database, so the same task code works in both environments. Use it for state that does not fit collections, for example managing dynamic lookup tables (like a wallet tracker’s address list) or maintaining your own custom schema.

Signature

The result is always an object with a rows array:

The schema argument

The first argument is the Postgres schema your query runs against, and it is required. Compose sets the schema as the search_path before running your query, so your SQL can reference tables in that schema without qualifying every name. The schemas reserved for Compose internals (public, pg_catalog, and information_schema) are blocked, and the name must be a valid SQL identifier (letters, digits, and underscores, starting with a letter or underscore). Pick a custom schema for your tables, for example app or tracker.

Parameters

Use Postgres-native positional placeholders ($1, $2, …) and pass values in the params array. When running locally against SQLite, the placeholders are converted to ? for you, so you can write one query that works in both environments.

Examples

Create and read a lookup table

Like all context functions, ctx.db.query calls are logged for auditing and are deterministically cached within a task run: if a run is interrupted and resumed, completed queries return their cached results instead of re-executing. See Context Functions for details.