Alembic Autogenerate Enums

0.1.2 · active · verified Thu Apr 16

alembic-autogenerate-enums is a Python library that provides an Alembic hook to automatically handle the upgrading and downgrading of enum values in database migrations. It simplifies managing changes to SQLAlchemy `Enum` types, particularly when adding, removing, or reordering enum members. The current version is 0.1.2, and it appears to have a low but steady release cadence, focusing on stability and compatibility with older SQLAlchemy versions.

Common errors

Warnings

Install

Imports

Quickstart

To enable automatic enum migration, you need to integrate `create_api()` into your `alembic/env.py` file by passing the `api` instance to `context.configure()`. Additionally, ensure that your SQLAlchemy `Enum` columns in your models use `alembic_autogenerate_enums.ColumnEnum` for the library to track changes effectively. The `values_callable` argument is crucial for `ColumnEnum` to correctly extract enum values.

from alembic import context
from alembic_autogenerate_enums import create_api
from sqlalchemy import create_engine, MetaData

# Assuming these are defined elsewhere in your env.py
# target_metadata = Base.metadata or some other SQLAlchemy MetaData object
# config = context.config # Alembic configuration object

# Placeholder for database connection and target_metadata
DATABASE_URL = os.environ.get('DATABASE_URL', 'sqlite:///:memory:')
connectable = create_engine(DATABASE_URL)
target_metadata = MetaData() # Replace with your actual target_metadata

# --- The key integration part in env.py ---

# 1. Create the API instance
api = create_api()

# 2. Integrate the API into context.configure
def run_migrations_online():
    with connectable.connect() as connection:
        context.configure(
            connection=connection,
            target_metadata=target_metadata,
            api=api, # Pass the API instance here!
            # include_object=include_object, # Optional, if you have one
            # process_revision_directives=process_revision_directives # Optional, if you have one
        )

        with context.begin_transaction():
            context.run_migrations()

# Call the function if running online
# if context.is_offline_mode():
#     run_migrations_offline()
# else:
#     run_migrations_online()

# Example model using ColumnEnum
import enum
from sqlalchemy.orm import declarative_base, Mapped, mapped_column
from sqlalchemy import String

Base = declarative_base()

class UserStatus(enum.Enum):
    ACTIVE = 'active'
    INACTIVE = 'inactive'
    PENDING = 'pending'

class User(Base):
    __tablename__ = 'users'
    id: Mapped[int] = mapped_column(primary_key=True)
    status: Mapped[UserStatus] = mapped_column(ColumnEnum(UserStatus, values_callable=lambda x: [m.value for m in x]))

print("Alembic Autogenerate Enums setup snippet ready for integration into env.py.")

view raw JSON →