A PostgreSQL SQL formatter with multiple style options.
pgfmt parses SQL using tree-sitter-postgres and reformats it according to one of several well-known style guides. Formatting is powered by libpgfmt.
brew tap gmr/pgfmt
brew install pgfmtcurl -fsSL https://raw.githubusercontent.com/gmr/pgfmt/main/install.sh | shTo install to a custom directory:
INSTALL_DIR=~/.local/bin curl -fsSL https://raw.githubusercontent.com/gmr/pgfmt/main/install.sh | shVERSION=v1.0.0 curl -fsSL https://raw.githubusercontent.com/gmr/pgfmt/main/install.sh | shcargo install pgfmtPre-built binaries for Linux and macOS (x86_64 and aarch64) are available on the GitHub Releases page.
# Format a file (default: aweber style)
pgfmt query.sql
# Format from stdin
echo "SELECT a,b FROM t WHERE x=1" | pgfmt
# Choose a style
pgfmt --style mozilla query.sql
pgfmt --style dbt query.sql
# Check if already formatted (exit 1 if not)
pgfmt --check query.sql| Style | Based On |
|---|---|
| aweber (default) | AWeber SQL Style Guide |
| dbt | How we style our SQL by dbt Labs |
| gitlab | GitLab SQL Style Guide |
| kickstarter | Kickstarter SQL Style Guide by Fred Benenson |
| mattmc3 | Modern SQL Style Guide by mattmc3 |
| mozilla | Mozilla SQL Style Guide |
| river | SQL Style Guide by Simon Holywell |
Based on river style with JOINs as river keywords. INNER JOIN, LEFT JOIN, etc. participate in river alignment. Uppercase keywords.
SELECT r.last_name
FROM riders AS r
INNER JOIN bikes AS b
ON r.bike_vin_num = b.vin_num
AND b.engines > 2;Based on dbt Labs' SQL style. Lowercase keywords, 4-space indent, blank lines between clauses, generous whitespace. Explicit join types.
select
a.title,
a.release_date
from albums as a
where
a.title = 'Charcoal Lane'
or a.title = 'The New Danger'Based on the GitLab SQL Style Guide. Uppercase keywords, 2-space indent, blank lines inside CTE bodies.
SELECT
a.title,
a.release_date
FROM albums AS a
WHERE
a.title = 'Charcoal Lane'
OR a.title = 'The New Danger';Based on the Kickstarter SQL Style Guide. Uppercase keywords, 2-space indent, JOIN ON on same line, compact CTE chaining.
SELECT
a.title,
a.release_date
FROM albums AS a
INNER JOIN orders AS o ON a.id = o.album_id
WHERE
a.title = 'Charcoal Lane'
AND a.year > 2000;Based on the Modern SQL Style Guide
by mattmc3. Lowercase river-style with leading commas. Uses plain join
instead of inner join.
select a.title
, a.release_date
from albums as a
join orders as o
on a.id = o.album_id
where a.title = 'Charcoal Lane'
and a.year > 2000;Based on the Mozilla SQL Style Guide. Keywords left-aligned at column 0, content indented 4 spaces underneath. One item per line. Uppercase keywords.
SELECT
a.title,
a.release_date
FROM albums AS a
WHERE
a.title = 'Charcoal Lane'
OR a.title = 'The New Danger';Based on sqlstyle.guide by Simon Holywell. Keywords are right-aligned to form a visual "river" separating keywords from content. Uppercase keywords.
SELECT a.title,
a.release_date
FROM albums AS a
WHERE a.title = 'Charcoal Lane'
OR a.title = 'The New Danger';