Skip to main content
The dump command extracts a PostgreSQL database schema for a specific schema and outputs it in a developer-friendly format. The dumped schema serves as a baseline that developers can modify and apply to target databases using the plan and apply commands.

Overview

The dump command provides comprehensive schema extraction with:
  1. Single schema targeting (defaults to ‘public’)
  2. Dependency-aware object ordering
  3. Cross-schema reference handling with smart qualification (or forced full qualification via --qualify-schema)
  4. Developer-friendly SQL output format
  5. Single-file and multi-file organization options

Basic Usage

Integration with Plan/Apply

Connection Options

string
default:"localhost"
Database server host (env: PGHOST)
integer
default:"5432"
Database server port (env: PGPORT)
string
required
Database name (required) (env: PGDATABASE)
string
required
Database user name (required) (env: PGUSER)
string
Database password (optional, can also use PGPASSWORD env var or .pgpass file)You can provide the password in multiple ways (in order of precedence):
Password Resolution Order:
  1. Command line --password flag (highest priority)
  2. PGPASSWORD environment variable
  3. .pgpass file in user’s home directory
  4. PostgreSQL will prompt for password if none found
See dotenv (.env) for detailed configuration options.
string
default:"prefer"
SSL mode for database connection (env: PGSSLMODE)Valid values: disable, allow, prefer, require, verify-ca, verify-fullFor verify-ca and verify-full modes, you can configure certificate paths using standard PostgreSQL environment variables (PGSSLROOTCERT, PGSSLCERT, PGSSLKEY).
string
default:"public"
Schema name to dump

Output Options

boolean
default:"false"
Output schema to multiple files organized by object type. See Multi-file Schema Management Workflow.When enabled, creates a structured directory with:
  • Main file with header and include statements
  • Separate directories for different object types (tables, views, functions, etc.)
  • Each database object in its own file
Requires --file to specify the main output file path.
string
Output file path (required when —multi-file is used)For single-file mode, this is optional (defaults to stdout). For multi-file mode, this specifies the main file path.
boolean
default:"false"
Do not output object comment headers (e.g., -- Name: users; Type: TABLE; Schema: -; Owner: -).The dump header with pgschema version information is retained. This option is useful when you need pure DDL output without per-object commentary.
boolean
default:"false"
Force full schema qualification of object identifiers in the dump, even for objects in the dumped schema.By default, pgschema uses smart qualification and omits the schema prefix for objects in the dumped schema. With this flag, object names and references are schema-qualified (schema.object) — useful when the dump must resolve unambiguously regardless of search_path, or to simplify static analysis. A couple of positions are necessarily excepted (CREATE INDEX names, and same-schema type references) — see Forced Qualification below.

Ignoring Objects

You can exclude specific database objects from dumps using a .pgschemaignore file. See Ignore (.pgschemaignore) for complete documentation.

Examples

Schema Dump

Example output:

Multi-File Output

This creates a structured directory layout:
The main schema.sql file contains:
Each individual file (e.g., tables/users.sql) contains the specific object definition:

Schema Qualification

pgschema uses smart schema qualification to make dumps portable:
  • Objects within the dumped schema: No schema qualifier added
  • Objects from other schemas: Fully qualified with schema name
This approach makes the dump suitable as a baseline that can be applied to different schemas, particularly useful for multi-tenant applications.
Output for objects within ‘public’ schema (no qualification):
This qualification strategy enables using one schema as a template for multiple tenants:
Because objects within the schema are not qualified, they will be created in whichever schema you specify during the apply command.

Forced Qualification

Pass --qualify-schema to force schema qualification on object names and references, even for objects in the dumped schema:
Object names and references keep their schema prefix:
PostgreSQL keeps CREATE INDEX names unqualified (an index lives in its table’s schema), so only the target table is qualified. This is useful when:
  • Unambiguous resolution — a fully qualified schema.object resolves the same way regardless of the session search_path, avoiding the ambiguity described in #320. (Reserved-word names are handled separately by quoting, which pgschema always applies where needed, e.g. "user".)
  • Static analysis — keeping complete qualifiers means tools don’t have to infer schema context from directory layout (for example to distinguish app.user from api.user).
Forced qualification covers object names and structural references where PostgreSQL syntax permits — table, view, sequence, type, function, procedure, and policy names; index targets and comments; and ON, REFERENCES, OWNED BY, and COMMENT targets. Object comment headers also keep the schema name instead of collapsing it to -.
--qualify-schema does not currently qualify type references to the dumped schema — column types, function/procedure parameter and return types, domain base types, and similar. PostgreSQL reports these without a schema for types in the current schema, and pgschema stores them as-is, so they remain unqualified. Cross-schema type references are still fully qualified. Tracking: #493.
Forced qualification applies to structural identifiers only — it does not rewrite free-form SQL text such as view definitions, policy USING / WITH CHECK expressions, or function and procedure bodies. Identifiers inside those bodies are emitted exactly as PostgreSQL reports them, so a reference like example.user inside a function body is not added or changed by this flag.