Skip to content

Data & Databases

The database operators share a common shape: a query action for reads, an execute action for writes, and (where the engine supports it) bulk operations. Connection strings and pool settings live on the connection, never in the flow.

Operatorinvoke:Typical actions
PostgreSQLpostgresql.*query, execute
MS-SQLmssql.*query, execute, bulk-insert
MySQLmysql.*query, execute
Oracleoracle.*query, execute
Redshiftredshift.*query, execute, Spectrum/COPY workflows
using:
- zenvara/postgresql
steps:
- $orders:
invoke: postgresql.query
on: warehouse
with:
Query: "SELECT id, customer, total FROM orders WHERE order_date = '${date}'"

Output: rows (the result set, a typed list) and metadata. Reference as ${orders.rows}. Parameterise queries through the flow’s typed input: rather than string-concatenating untrusted values.

Operatorinvoke:Notes
MongoDBmongodb.*Document find / insert / update / aggregate. Filter inputs are validated to prevent injection.

Three of the most common data operations are not operators — they are built into the runtime and need no using: import. They are documented in full under Transformers:

  • join: — relational join of two sources (inner / left / right / full).
  • delta: — change detection across runs (compare, hash, per-row by: hash).
  • filter: — SQL-like filtering on payload arrays (where:, order-by:, limit:, fields:).

A common pattern is to query a database, delta: against a persisted snapshot to find only what changed, and write back just the delta — incremental sync without an external CDC system.

The engine streams and spills large datasets to disk rather than holding everything in memory, so a query that returns millions of rows does not exhaust the process. This is automatic; you author the flow the same way regardless of size.