Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

sqlalchemy postgresql enum does not create type on db migrate

I develop a web-app using Flask under Python3. I have a problem with postgresql enum type on db migrate/upgrade.

I added a column "status" to model:

class Banner(db.Model):     ...     status = db.Column(db.Enum('active', 'inactive', 'archive', name='banner_status'))     ... 

Generated migration by python manage.py db migrate is:

from alembic import op import sqlalchemy as sa  def upgrade():     op.add_column('banner', sa.Column('status', sa.Enum('active', 'inactive', 'archive', name='banner_status'), nullable=True))  def downgrade():     op.drop_column('banner', 'status') 

And when I do python manage.py db upgrade I get an error:

... sqlalchemy.exc.ProgrammingError: (psycopg2.ProgrammingError) type "banner_status" does not exist LINE 1: ALTER TABLE banner ADD COLUMN status banner_status   [SQL: 'ALTER TABLE banner ADD COLUMN status banner_status'] 

Why migration does not create a type "banner_status"?

What am I doing wrong?

$ pip freeze alembic==0.8.6 Flask==0.10.1 Flask-Fixtures==0.3.3 Flask-Login==0.3.2 Flask-Migrate==1.8.0 Flask-Script==2.0.5 Flask-SQLAlchemy==2.1 itsdangerous==0.24 Jinja2==2.8 Mako==1.0.4 MarkupSafe==0.23 psycopg2==2.6.1 python-editor==1.0 requests==2.10.0 SQLAlchemy==1.0.13 Werkzeug==0.11.9 
like image 802
Alexey Egorov Avatar asked Jun 16 '16 02:06

Alexey Egorov


Video Answer


1 Answers

I decided this problem using that.

I changed code of migration and migration is look like this:

from alembic import op import sqlalchemy as sa from sqlalchemy.dialects import postgresql  def upgrade():     banner_status = postgresql.ENUM('active', 'inactive', 'archive', name='banner_status')     banner_status.create(op.get_bind())      op.add_column('banner', sa.Column('status', sa.Enum('active', 'inactive', 'archive', name='banner_status'), nullable=True))  def downgrade():     op.drop_column('banner', 'status')      banner_status = postgresql.ENUM('active', 'inactive', 'archive', name='banner_status')     banner_status.drop(op.get_bind()) 

And now python manage.py db upgrade\downgrade is succesfully executed.

like image 80
Alexey Egorov Avatar answered Sep 19 '22 17:09

Alexey Egorov