flask-миграция застряла при понижении с таблицей, содержащей поле перечисления

#python #flask #sqlalchemy #alembic #flask-migrate

#python #фляжка #sqlalchemy #перегонный куб #flask-миграция

Вопрос:

Я определил следующие модели, используя sqlalchemy, и мой сервер базы данных — mysql.

 from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
    
class Vehicle(db.Model):

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50), unique=True, nullable=False)

    def __str__(self):
    return self.name


class Branch(db.Model):

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(100), unique=True, nullable=False)
    tracking_radius = db.Column(db.Integer)
    default_basket_size = db.Column(db.Float)
    product = db.Column(
    db.Enum(
        "x",
        "y",
        "Default",
        name="product_enum"),
        nullable=False)
    ignore_timeslot = db.Column(db.Boolean, nullable=False)

    def __str__(self):
    return self.name


class PricingConfig(db.Model):

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(100), unique=True, nullable=False)
    base_fare = db.Column(db.Integer, nullable=False)
    base_mileage = db.Column(db.Integer, nullable=False)
    mileage_fare = db.Column(db.Integer, nullable=False)
    terminal_fare = db.Column(db.Integer, nullable=False)

    def __str__(self):
    return self.name


class TemporalConfig(db.Model):

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(100), unique=True, nullable=False)
    create_to_accept = db.Column(db.Integer, nullable=False)
    accept_to_arrive = db.Column(db.Integer, nullable=False)
    arrive_to_pickup = db.Column(db.Integer, nullable=False)
    pickup_per_order = db.Column(db.Integer, nullable=False)
    arrive_to_deliver = db.Column(db.Integer, nullable=False)
    max_trip_duration = db.Column(db.Integer, nullable=False)

    def __str__(self):
    return self.name


    
 

Я использовал flask-migrate для создания таблиц. Файл миграции, созданный alembic, выглядит следующим образом:

 """empty message

Revision ID: 0c88c06df5ad
Revises: 
Create Date: 2020-11-10 19:42:34.096684

"""
from alembic import op
import sqlalchemy as sa


# revision identifiers, used by Alembic.
revision = '0c88c06df5ad'
down_revision = None
branch_labels = None
depends_on = None


def upgrade():
    # ### commands auto generated by Alembic - please adjust! ###
    op.create_table('branch',
    sa.Column('id', sa.Integer(), nullable=False),
    sa.Column('name', sa.String(length=100), nullable=False),
    sa.Column('tracking_radius', sa.Integer(), nullable=True),
    sa.Column('default_basket_size', sa.Float(), nullable=True),
    sa.Column('product', sa.Enum('x', 'y', 'Default', name='product_enum'), nullable=False),
    sa.Column('ignore_timeslot', sa.Boolean(), nullable=False),
    sa.PrimaryKeyConstraint('id'),
    sa.UniqueConstraint('name')
    )
    op.create_table('pricing_config',
    sa.Column('id', sa.Integer(), nullable=False),
    sa.Column('name', sa.String(length=100), nullable=False),
    sa.Column('base_fare', sa.Integer(), nullable=False),
    sa.Column('base_mileage', sa.Integer(), nullable=False),
    sa.Column('mileage_fare', sa.Integer(), nullable=False),
    sa.Column('terminal_fare', sa.Integer(), nullable=False),
    sa.PrimaryKeyConstraint('id'),
    sa.UniqueConstraint('name')
    )
    op.create_table('temporal_config',
    sa.Column('id', sa.Integer(), nullable=False),
    sa.Column('name', sa.String(length=100), nullable=False),
    sa.Column('create_to_accept', sa.Integer(), nullable=False),
    sa.Column('accept_to_arrive', sa.Integer(), nullable=False),
    sa.Column('arrive_to_pickup', sa.Integer(), nullable=False),
    sa.Column('pickup_per_order', sa.Integer(), nullable=False),
    sa.Column('arrive_to_deliver', sa.Integer(), nullable=False),
    sa.Column('max_trip_duration', sa.Integer(), nullable=False),
    sa.PrimaryKeyConstraint('id'),
    sa.UniqueConstraint('name')
    )
    op.create_table('vehicle',
    sa.Column('id', sa.Integer(), nullable=False),
    sa.Column('name', sa.String(length=50), nullable=False),
    sa.PrimaryKeyConstraint('id'),
    sa.UniqueConstraint('name')
    )
    # ### end Alembic commands ###


def downgrade():
    # ### commands auto generated by Alembic - please adjust! ###
    op.drop_table('vehicle')
    op.drop_table('temporal_config')
    op.drop_table('pricing_config')
    op.drop_table('branch')
    # ### end Alembic commands ###
    
    
 

Команды flask db upgrade и flask db downgrade работают нормально, если я полностью удаляю таблицу ветвей, но при попытке удалить таблицу ветвей понижение зависает на неопределенный срок. Я проверил наличие любых потенциальных блокировок в таблицах, используя show open tables команду в терминале mysql, но ни в каких таблицах нет блокировок. Я считаю, что эта проблема связана со столбцом перечисления, определенным в product поле, но я все еще не понимаю источника этой проблемы и как ее исправить.

Комментарии:

1. Я сильно подозреваю, что это все еще проблема с блокировкой, возможно, не в таблице, а в другом объекте.

2. Как вы думаете, где я должен проверять наличие других блокировок?