#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 ###