Why sqlfluff Can’t Lint Our SQL Conventions — and a 240-Line Script Can

The conventions were settled: procedure skeletons, DECLARE banners, file naming, forbidden constructs — all versioned in rule files, every rule with its rationale. The only open question was which tool should check the SQL conventions. And the first reflex was the same one that probably surfaces in every Postgres team with convention ambitions: “Just use … Read more

Database CI/CD with PostgreSQL — the Complete Lifecycle from Object File to Automated Deploy

In many projects the database schema lives in the database instead of the repository — grown out of years of hand-run ALTERs, fully documented nowhere. It only becomes visible when a second environment is needed or a deploy breaks. Postgres database CI/CD flips that relationship: the repository describes the desired state, and every environment — from the throwaway … Read more

GitHub Actions for Postgres Deploys — a Throwaway Database as Quality Gate

The bug was a typo in an ALTER TABLE — and it was found by the staging deploy on a Friday afternoon. Yet that exact find is automatable: set up a GitHub Actions Postgres deployment against a throwaway database, and every pull request becomes a full dress rehearsal. Syntax and semantic errors, ordering problems, and broken idempotency surface before … Read more

Tracking Schema Changes Without a Framework — Run-Once Scripts, Checksums and Immutability

The backfill ran a second time on the second deploy — and overwrote values that had been corrected by the business in the meantime. Accidents like this are not prevented by discipline, only by a memory: if you want to track database schema changes without introducing Flyway or Liquibase, all it takes is exactly one table and … Read more

Adding a NOT NULL Column to a Populated Table — the Expand/Contract Pattern

The ALTER TABLE ran through cleanly on your machine — on staging, the same deploy fails with column “country_code” of relation “customer” contains null values. The difference is not the SQL, it is the data: the local table was empty, the one on staging was not. If you want to add a NOT NULL column to an existing table that … Read more