The SemiColon Style — a PostgreSQL SQL formatter
Project description
SemiColon
Philosophy
Most SQL formatters produce code that is syntactically correct but visually noisy.
The SemiColon Style treats SQL as prose: it has a rhythm, a visible structure, and a
clear centre of gravity — the River.
The goal is not merely consistency; it is readability at a glance.
Installation
From PyPI
pip install semicolonfmt
From source
git clone https://github.com/mustafaa7med/semicolon.git
cd semicolon
pip install -e .
Verify
semicolon --version
Usage
Format a single file
semicolon query.sql
The file is formatted in-place.
Format all .sql files in the current directory
semicolon .
CI/CD check mode
semicolon query.sql --check # exits 1 if formatting is needed
semicolon . --check # check all .sql files
No files are written in --check mode — it is safe to use in pipelines.
Before & After
Before (messy, unformatted)
with
active_users as (
select u.id, u.name as user_name, u.email as user_email, u.created_at from users u where u.active = true and u.deleted_at is null
),
recent_orders as (
select o.user_id, count(*) as order_count, sum(o.total) as total_spent from orders o where o.created_at between '2024-01-01' and '2024-12-31' group by o.user_id
)
select au.user_name, au.user_email, ro.order_count, ro.total_spent from active_users au left join recent_orders ro on au.id = ro.user_id where ro.total_spent > 500 order by ro.total_spent desc limit 100;
After
WITH active_users AS(
SELECT u.id,
u.name AS user_name,
u.email AS user_email,
u.created_at
FROM users u
WHERE u.active = TRUE
AND u.deleted_at IS NULL
),
recent_orders AS(
SELECT o.user_id,
COUNT(*) AS order_count,
SUM(o.total) AS total_spent
FROM orders o
WHERE o.created_at BETWEEN '2024-01-01'
AND '2024-12-31'
GROUP BY o.user_id
)
SELECT au.user_name,
au.user_email,
ro.order_count,
ro.total_spent
FROM active_users au
LEFT JOIN recent_orders ro
ON au.id = ro.user_id
WHERE ro.total_spent > 500
ORDER BY ro.total_spent DESC
LIMIT 100;
Pre-commit Integration
# .pre-commit-config.yaml
repos:
- repo: https://github.com/mustafaa7med/semicolon
rev: v0.1.3
hooks:
- id: semicolon
args: [--check]
License
Apache — see LICENSE.
Designed by Mostafa Ahmed (Alfie)
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file semicolonfmt-0.1.3.tar.gz.
File metadata
- Download URL: semicolonfmt-0.1.3.tar.gz
- Upload date:
- Size: 18.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1896aad809b443a34dbfbcd1b46721590f4f3705a291390f62e85dda0cd4ddc0
|
|
| MD5 |
da61f9395bcc650f420eb292bc883906
|
|
| BLAKE2b-256 |
fbe00da62e234a64d3dc7eb731a556933870852364db0108a2142241c7598cb2
|
File details
Details for the file semicolonfmt-0.1.3-py3-none-any.whl.
File metadata
- Download URL: semicolonfmt-0.1.3-py3-none-any.whl
- Upload date:
- Size: 15.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
25fb268b78a4613bfb819a4230f45c71022f324f8bee4f862d2f2732c9446191
|
|
| MD5 |
22178eabc78ae2fec3d51fe57173e6c6
|
|
| BLAKE2b-256 |
64945786b19261807514dca60a380ee9be39d77e32c2aa7d14232a004979deec
|