Lightweight Alembic extension for PostgreSQL enum value additions using ALTER TYPE ... ADD VALUE
Project description
Alembic PostgreSQL Enum Generator
A lightweight Alembic extension for PostgreSQL enum value additions.
Why Use This?
Unlike complex enum sync libraries that use heavy "replace-and-cast" approaches causing table locks and full table scans, this library uses PostgreSQL's efficient ALTER TYPE ... ADD VALUE statement for:
- ✅ No table locking - only brief enum type locks
- ✅ Production-safe - minimal database impact
- ✅ Lightning fast - no data conversion required
- ✅ Add-only operations - perfect for compatibility-focused environments
Installation
pip install alembic-pg-enum-generator
Usage
1. Import in your Alembic env.py
# In your alembic/env.py file
import alembic_pg_enum_generator
# The import automatically registers with Alembic's autogenerate system
2. Define your enums in SQLAlchemy
from sqlalchemy import Column, Integer, String, Enum
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class UserStatus(Enum):
ACTIVE = "active"
INACTIVE = "inactive"
PENDING = "pending" # Add this new value
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String(50))
status = Column(Enum(UserStatus, name='user_status'))
3. Generate migration
alembic revision --autogenerate -m "Add pending status to user_status enum"
4. Generated migration
"""Add pending status to user_status enum
Revision ID: abc123
Revises: def456
Create Date: 2024-01-01 12:00:00.000000
"""
from alembic import op
def upgrade():
# Simple, efficient ALTER TYPE statement
op.add_enum_value('public', 'user_status', 'pending')
def downgrade():
# Downgrade not supported for compatibility
pass
Configuration
Filter enum names
import alembic_pg_enum_generator
# Only process enums matching certain patterns
config = alembic_pg_enum_generator.Config(
include_name=lambda name: name.startswith('app_')
)
alembic_pg_enum_generator.set_configuration(config)
Features
✅ What it does
- Automatically detects new enum values in SQLAlchemy models
- Generates efficient
ALTER TYPE ... ADD VALUEstatements - Integrates seamlessly with Alembic's autogenerate
- Works with multiple schemas
- Supports TypeDecorator wrapped enums
- Handles array columns with enums
❌ What it doesn't do
- No enum value deletion (use manual migrations for compatibility)
- No enum value reordering (PostgreSQL doesn't support this anyway)
- No enum renaming (use manual migrations)
- No downgrade support (enum additions are permanent for compatibility)
Performance Comparison
| Operation | Alembic PG Enum Generator | Heavy Sync Libraries |
|---|---|---|
| SQL Command | ALTER TYPE enum_name ADD VALUE 'new_value' |
Complex replace-and-cast with temp types |
| Table Lock | ✅ None | ❌ ACCESS EXCLUSIVE (blocks all operations) |
| Data Scan | ✅ None | ❌ Full table scan + rewrite |
| Production Impact | 🟢 Minimal (milliseconds) | 🔴 High (minutes on large tables) |
Example: Adding Multiple Values
# Before
class Priority(Enum):
LOW = "low"
HIGH = "high"
# After
class Priority(Enum):
LOW = "low"
MEDIUM = "medium" # New value 1
HIGH = "high"
CRITICAL = "critical" # New value 2
Generated migration:
def upgrade():
op.add_enum_value('public', 'priority', 'medium')
op.add_enum_value('public', 'priority', 'critical')
Requirements
- Python 3.8+ (including 3.13)
- Alembic 1.0+
- SQLAlchemy 1.4+
- PostgreSQL (any version supporting ALTER TYPE ... ADD VALUE)
Contributing
We welcome contributions! Please see our Contributing Guide for details.
Development Setup
- Clone the repository:
git clone https://github.com/xiang9156/alembic-pg-enum-generator.git
cd alembic-pg-enum-generator
- Install dependencies with uv:
uv sync --all-extras --dev
- Set up pre-commit hooks:
uv run pre-commit install
- Run tests:
uv run pytest
Code Quality
- Linting:
uv run ruff check . - Formatting:
uv run ruff format . - Type checking:
uv run mypy alembic_pg_enum_generator - Tests:
uv run pytest --cov=alembic_pg_enum_generator
Changelog
See CHANGELOG.md for details about changes in each version.
License
MIT License - see LICENSE file for details.
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 alembic_pg_enum_generator-0.1.4.tar.gz.
File metadata
- Download URL: alembic_pg_enum_generator-0.1.4.tar.gz
- Upload date:
- Size: 126.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
542a5084605f986253dc65a9883a33a0751b1b507564f376bc980ba591d4151b
|
|
| MD5 |
36eb8ef9367a622772f16b6e77eb619b
|
|
| BLAKE2b-256 |
ead2404d4cce742bbda687e33b4081b0a03b8fe695dfd761ca3cad71f1e95e5c
|
File details
Details for the file alembic_pg_enum_generator-0.1.4-py3-none-any.whl.
File metadata
- Download URL: alembic_pg_enum_generator-0.1.4-py3-none-any.whl
- Upload date:
- Size: 11.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2de19e360f4afac7f5d76a72828eff232493715c39db6f5c1eaa78589741b0ca
|
|
| MD5 |
1651c3506b5e842d4d1ee333a3952e58
|
|
| BLAKE2b-256 |
8a43ad7e84458710bff66f950682b1179e774d97113d8d2dd8b75226707e3d3c
|