12

Tôi phát triển một ứng dụng web bằng cách sử dụng Flask theo Python3. Tôi có một vấn đề với loại enum postgresql trên di chuyển/nâng cấp db.sqlalchemy postgresql enum không tạo kiểu trên db di chuyển

Tôi đã thêm một cột "trạng thái" để mô hình:

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

tạo di cư bởi python manage.py db migrate là:

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

Và khi tôi làm python manage.py db upgrade tôi nhận được một lỗi:

... 
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'] 

Tại sao di chuyển không tạo loại "banner_status "?

Tôi đang làm gì sai?

$ 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 
+1

Từ đọc http://stackoverflow.com/questions/14845203/altering-an-enum-field-using-alembic và https://bitbucket.org/zzzeek/alembic/issues/67/autogenerate-with-enums -on-postgres-dont nó có vẻ như bạn có thể phải tự tạo và thả các enums. –

Trả lời

25

Tôi đã quyết định vấn đề này khi sử dụng.

tôi đã thay đổi mã số di cư và di cư là giống như thế này:

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

Và bây giờ python manage.py db upgrade\downgrade được thành công thực hiện.

+0

Để hạ cấp, bạn cũng có thể tránh trùng lặp bằng cách thực hiện SQL trực tiếp (ít nhất là đối với postgres): 'op.execute (" DROP TYPE banner_status; ")' – Geekfish

Các vấn đề liên quan