Alembic autogenerate support for creation, alteration and deletion of enums
Project description
alembic-postgresql-enum
Alembic autogenerate support for creation, alteration and deletion of enums
Alembic will now automatically:
- Create enums that currently are not in postgres schema
- Remove/add/alter enum values
- Reorder enum values
- Delete unused enums from schema
If you are curious to know about analogs and reasons for this library to exist see alternatives and motivation
Usage
Install library:
pip install alembic-postgresql-enum
Add the line:
# env.py
import alembic_postgresql_enum
...
To the top of your migrations/env.py file.
Features
- Creation of enums
- Deletion of unreferenced enums
- Creation of new enum values
- Deletion of enums values
- Renaming of enum values
Creation of enum
When table is created
class MyEnum(enum.Enum):
one = 1
two = 2
three = 3
class ExampleTable(BaseModel):
test_field = Column(Integer, primary_key=True, autoincrement=False)
enum_field = Column(postgresql.ENUM(MyEnum))
This code will generate migration given below:
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
# this line is generated by our library
sa.Enum('one', 'two', 'three', name='myenum').create(op.get_bind())
op.create_table('example_table',
sa.Column('test_field', sa.Integer(), nullable=False),
# create_type=False argument is now present on postgresql.ENUM as library takes care of enum creation
sa.Column('enum_field', postgresql.ENUM('one', 'two', 'three', name='myenum', create_type=False), nullable=True),
sa.PrimaryKeyConstraint('test_field')
)
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
# drop_table does not drop enum by alembic
op.drop_table('example_table')
# It is dropped by us
sa.Enum('one', 'two', 'three', name='myenum').drop(op.get_bind())
# ### end Alembic commands ###
When column is added
class MyEnum(enum.Enum):
one = 1
two = 2
three = 3
class ExampleTable(BaseModel):
test_field = Column(Integer, primary_key=True, autoincrement=False)
# this column has just been added
enum_field = Column(postgresql.ENUM(MyEnum))
This code will generate migration given below:
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
# this line is generated by our library
sa.Enum('one', 'two', 'three', name='myenum').create(op.get_bind())
# create_type=False argument is now present on postgresql.ENUM as library takes care of enum creation
op.add_column('example_table', sa.Column('enum_field', postgresql.ENUM('one', 'two', 'three', name='myenum', create_type=False), nullable=False))
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.drop_column('example_table', 'enum_field')
# enum is explicitly dropped as it is no longer used
sa.Enum('one', 'two', 'three', name='myenum').drop(op.get_bind())
# ### end Alembic commands ###
Deletion of unreferenced enum
If enum is defined in postgres schema, but its mentions removed from code - It will be automatically removed
class ExampleTable(BaseModel):
test_field = Column(Integer, primary_key=True, autoincrement=False)
# enum_field is removed from table
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.drop_column('example_table', 'enum_field')
sa.Enum('one', 'two', 'four', name='myenum').drop(op.get_bind())
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
sa.Enum('one', 'two', 'four', name='myenum').create(op.get_bind())
op.add_column('example_table', sa.Column('enum_field', postgresql.ENUM('one', 'two', 'four', name='myenum', create_type=False), autoincrement=False, nullable=True))
# ### end Alembic commands ###
Creation of new enum values
If new enum value is defined sync_enum_values function call will be added to migration to account for it
class MyEnum(enum.Enum):
one = 1
two = 2
three = 3
four = 4 # New enum value
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.sync_enum_values('public', 'myenum', ['one', 'two', 'three', 'four'],
[('example_table', 'enum_field')],
enum_values_to_rename=[])
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.sync_enum_values('public', 'myenum', ['one', 'two', 'three'],
[('example_table', 'enum_field')],
enum_values_to_rename=[])
# ### end Alembic commands ###
Deletion of enums values
If enum value is removed it also will be detected
class MyEnum(enum.Enum):
one = 1
two = 2
# three = 3 removed
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.sync_enum_values('public', 'myenum', ['one', 'two'],
[('example_table', 'enum_field')],
enum_values_to_rename=[])
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.sync_enum_values('public', 'myenum', ['one', 'two', 'three'],
[('example_table', 'enum_field')],
enum_values_to_rename=[])
# ### end Alembic commands ###
Rename enum value
In this case you must manually edit migration
class MyEnum(enum.Enum):
one = 1
two = 2
three = 3 # renamed from `tree`
This code will generate this migration:
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.sync_enum_values('public', 'myenum', ['one', 'two', 'three'],
[('example_table', 'enum_field')],
enum_values_to_rename=[])
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.sync_enum_values('public', 'myenum', ['one', 'two', 'tree'],
[('example_table', 'enum_field')],
enum_values_to_rename=[])
# ### end Alembic commands ###
This migration will cause problems with existing rows that references MyEnum
So adjust migration like that
def upgrade():
op.sync_enum_values('public', 'myenum', ['one', 'two', 'three'],
[('example_table', 'enum_field')],
enum_values_to_rename=[('tree', 'three')])
def downgrade():
op.sync_enum_values('public', 'myenum', ['one', 'two', 'tree'],
[('example_table', 'enum_field')],
enum_values_to_rename=[('three', 'tree')])
Do not forget to switch places old and new values for downgrade
All defaults in postgres will be renamed automatically as well
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
Hashes for alembic_postgresql_enum-1.1.1.tar.gz
Algorithm | Hash digest | |
---|---|---|
SHA256 | c8a971937af4d4acb8012c853a9a6c7b67db0fd2ecfb7c91708c531488e6d725 |
|
MD5 | b31a27041529f435ae1bde5377aa2971 |
|
BLAKE2b-256 | 40675dd50a0d547902a0d2c9425f163b0ed1939df15ea4fe6635488cb9c81378 |
Hashes for alembic_postgresql_enum-1.1.1-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | f902e0a4d9d1d29b8c4c429b448bf43323fd8e97ad750905b6e5fcf7c5269571 |
|
MD5 | b2a07505edda77f1c82894c2d25cd882 |
|
BLAKE2b-256 | f3e14808bb68fea1fd055832f1a911dd063d61d7aa8cd20e38ce3b4ab4aa1ebc |