Я не могу создать поле типа перечисления: sqlalchemy.exc.Ошибка программирования: (psycopg2.ошибки.Неопределенный объект) тип «тип компании» не существует

#postgresql #sqlalchemy #alembic

Вопрос:

 from aenum import Enum

class CompanyType(Enum):
    type1 = 1
    type2 = 2

class Company(BaseModel):

    __tablename__ = 'company'

    company_type = db.Column(db.Enum(CompanyType), default=CompanyType.type1, nullable=False)
 

Странно то, что у меня уже есть другая модель с полем перечисления, и она работала нормально, создала переменную в самой базе данных. Но я не помню, что именно я тогда делал.
На этот раз у меня есть исключение, когда я пытаюсь обновить базу данных перегонным кубом.

ошибка программирования sqlalchemy.exc.: (psycopg2.ошибки.Неопределенный объект) тип «тип компании» не существует СТРОКА 1: ИЗМЕНИТЬ КОМПАНИЮ ТАБЛИЦЫ ДОБАВИТЬ тип СТОЛБЦА тип компании НЕ … ^

[SQL: ИЗМЕНИТЬ компанию ТАБЛИЦЫ, ДОБАВИТЬ тип СТОЛБЦА, тип компании НЕ РАВЕН НУЛЮ] (Предыстория этой ошибки по адресу: http://sqlalche.me/e/13/f405)

Код, который генерирует перегонный куб, является:

 def upgrade():
    # ### commands auto generated by Alembic - please adjust! ###
    op.add_column('company', sa.Column('type', sa.Enum('type1', 'type2', name='companytype'), nullable=True))
    # ### end Alembic commands ###
 

У меня такое чувство, что я должен сказать база данных, чтобы создать эту переменную, но я не знаю, как это сделать.

Обновить

Я нашел обходной путь. Оказалось, что проблема возникает только тогда, когда таблица уже существует. Итак, я создал временную таблицу с тем же столбцом, и скрипт сгенерировал переменную перечисления в базе данных. Затем я удалил эту таблицу и добавил столбец в таблицу моей компании, и это, наконец, сработало. Не уверен, что это ошибка и чья именно.

Ответ №1:

Проблема, с которой вы столкнулись, — это ошибка в перегонном кубе. На данный момент вам необходимо изменить upgrade функцию вручную, чтобы успешно обновить базу данных, когда Enum она уже существует:

 from sqlalchemy.dialects import postgresql

def upgrade():
    # ### commands auto generated by Alembic - please adjust! ###
    companytype_enum = postgresql.ENUM('type1', 'type2', name='companytype', create_type=False)
    companytype_enum.create(op.get_bind(), checkfirst=True)
    op.add_column('company', sa.Column('type', companytype_enum, nullable=True))
    # ### end Alembic commands ###