Skip to main content
 首页 » 编程设计

flask之sqlalchemy postgresql 枚举不会在 db migrate 上创建类型

2024年11月01日15insus

我在 Python3 下使用 Flask 开发了一个网络应用程序。我在 db migrate/upgrade 上有 postgresql 枚举类型的问题。

我在模型中添加了一列“状态”:

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

python manage.py db migrate 生成的迁移是:
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') 

当我这样做时 python manage.py db upgrade我收到一个错误:
... 
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'] 

为什么迁移不会创建类型“banner_status”?

我究竟做错了什么?
$ 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 

请您参考如下方法:

我用那个决定了这个问题。

我更改了迁移代码,迁移代码如下所示:

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()) 

现在 python manage.py db upgrade\downgrade成功执行。