Skip to main content

Split Alembic migrations into per-revision SQL files for linting with Squawk.

Project description

Release Notes Downloads GitHub CI Status License: MIT

Split Alembic Migrations into Per-Revision SQL Files

alembic-squawk runs Alembic in offline (SQL) mode and splits the output into one .sql file per migration revision. The primary use case is feeding those files to Squawk so lint failures point to a specific migration rather than a monolithic dump.

Features

  • Strips the outer BEGIN/COMMIT Alembic wraps the full dump in, so each file contains only its own migration SQL. Pass --assume-in-transaction to Squawk when linting.
  • Maps each revision back to its source .py file to preserve the original filename in output.
  • Reads squawk directives (e.g. # squawk-ignore-file <rule>, # squawk-disable <rule>) embedded as Python comments in migration files and prepends them as SQL directives in the generated output, so you can attach Squawk ignores without embedding raw SQL comments in Python source.
  • Supports filtering by revision range or creation date to narrow linting to recently added migrations.

Installation

uv add alembic-squawk

Usage

Run from your project root (where alembic.ini lives):

alembic-squawk --out-dir /tmp/alembic_sql

The output directory is wiped and recreated on every run.

Options

  • --out-dir (required): Directory to write SQL files into.
  • --revisions: Alembic revision range. Defaults to base:head. Accepts any valid range, e.g. origin/main@HEAD:head to dump only migrations not yet on main.
  • --created-after YYYY-MM-DD: Skip migrations created before this date.
  • --lint-preamble: Also write the Alembic preamble (boilerplate SET statements) to 000_preamble.sql. Skipped by default.
  • --verbose: Print the Alembic command and any stderr output.

Each file is named after its migration source file, e.g. 2026_03_16_d4b9da2f705c_add_users.sql.

Ignoring Squawk Errors

Squawk supports per-file ignore directives in SQL comments (e.g. -- squawk-ignore-file ban-drop-column). To attach these to a migration without embedding raw SQL comments in Python source, write the directive as a Python comment. The -- prefix is optional.

Note: The comment must be at the very beginning of the line. Indented comments (e.g., inside a function) or inline comments (e.g., op.execute("...") # squawk-disable) are not supported and will be ignored.

For example, to hide a drop column error in your migration:

"""add users table

Revision ID: 1a2b3c4d5e6f
Revises: 
Create Date: 2026-03-16 10:22:01.123456
"""

# squawk-ignore-file ban-drop-column
# -- squawk-disable require-concurrent-index-creation

from typing import Sequence, Union


from alembic import op
import sqlalchemy as sa

# ... migration code ...

When alembic-squawk generates the SQL for this revision, it will prepend those directives as standard SQL comments at the top of the file so Squawk honors them.

Example

Here is an end-to-end example of how you might integrate alembic-squawk into a CI script or standard shell workflow to lint your database migrations:

# generate per-revision SQL files
uv run alembic-squawk --out-dir /tmp/alembic-squawk-lint

# the generated SQL is not wrapped in a transaction, but the entire migration will be.
# note: we use --assume-in-transaction so squawk knows to lint appropriately.
squawk --assume-in-transaction --pg-version=15 /tmp/alembic-squawk-lint/*.sql

iloveitaly/python-starter-template is a full Python app with a working integration of alembic-squawk.

MIT License

This project was created from iloveitaly/python-package-template

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

alembic_squawk-0.2.0.tar.gz (7.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

alembic_squawk-0.2.0-py3-none-any.whl (8.7 kB view details)

Uploaded Python 3

File details

Details for the file alembic_squawk-0.2.0.tar.gz.

File metadata

  • Download URL: alembic_squawk-0.2.0.tar.gz
  • Upload date:
  • Size: 7.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.14 {"installer":{"name":"uv","version":"0.11.14","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for alembic_squawk-0.2.0.tar.gz
Algorithm Hash digest
SHA256 85c04997bb682759111189e01ad92e4c846ce5db74b2349bebdd943b3fb48c07
MD5 061028a9c81f687f8cc51deae16771b0
BLAKE2b-256 ff4317e4168738dde6bb71bb4c3ecfd8910d0a4fbf4b5c7ac5c5f21bb230e9ab

See more details on using hashes here.

File details

Details for the file alembic_squawk-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: alembic_squawk-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 8.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.14 {"installer":{"name":"uv","version":"0.11.14","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for alembic_squawk-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 3b59ab5c662bf901ab6eeaf6826e76084b31124401d22fc0f0bcaa4074eb64ef
MD5 7a43cbe867f5ebc2619cd1bac463e0e3
BLAKE2b-256 5f234bf566f50860937713e5c17a222d9df8f6e668a1a305254a32125088e437

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page