¶
Declarative schema management tool for PostgreSQL with a Terraform-like plan/apply workflow, built on pg_query_go. Define the desired schema in SQL; pistachio generates the DDL diff.
Try it with Docker¶
A demo image bundles PostgreSQL with a sample schema for trying pista without a local install:
docker run --rm -it ghcr.io/winebarrel/pistachio-demo
The container starts a shell in /demo with pista and psql preconfigured. Edit desired.sql, then run:
pista plan desired.sql # show the DDL diff
pista apply desired.sql # apply the changes
pista plan desired.sql # ...should now print "No changes"
pista dump # dump the current schema
The image sets $PISTA_MANAGE_ROUTINE, so the functions and procedures in the demo schema are managed too.
The source for the image is under demo/.
Installation¶
Homebrew¶
brew install winebarrel/pistachio/pistachio
Download binary¶
Download the latest binary from Releases.
| OS | Arch |
|---|---|
| macOS | amd64, arm64 |
| Linux | amd64, arm64 |
| Windows | amd64 |
Example¶
Create a schema file:
CREATE TYPE public.status AS ENUM ('active', 'inactive');
CREATE TABLE public.users (
id integer NOT NULL,
name text NOT NULL,
status status NOT NULL,
CONSTRAINT users_pkey PRIMARY KEY (id)
);
CREATE TABLE public.posts (
id integer NOT NULL,
user_id integer NOT NULL,
title text NOT NULL,
CONSTRAINT posts_pkey PRIMARY KEY (id)
);
CREATE INDEX idx_posts_user_id ON public.posts USING btree (user_id);
ALTER TABLE ONLY public.posts
ADD CONSTRAINT posts_user_id_fkey
FOREIGN KEY (user_id) REFERENCES users(id);
Preview and apply:
pista plan schema.sql # review the diff (drops suppressed by default)
pista plan --allow-drop all schema.sql # review the diff (with drops)
pista apply schema.sql # apply it
Or split the schema across multiple files:
pista dump --split ./schema/ # dump per table/view/enum/domain/composite type
pista plan ./schema/*.sql # review the diff
pista apply ./schema/*.sql # apply it
Where to go next¶
- Getting Started walks through dump, edit, plan, apply.
- Guides cover one task each: renaming, filtering, drops, transactions, multiple schemas.
- Commands lists every flag.
- Design and scope says what pistachio does not manage, and why.