Задать вопрос
@F3ANG

Неправильная очередность выполнения команд при запуске миграции alembic?

Изменил схему БД; создал новые таблицы, добавил ограничения на старые (Foreign Key, например).
Автоматически генерирую новую ревизию командой alembic revision --autogenerate .
Получаю такую миграцию:

def upgrade() -> None:
    # ### commands auto generated by Alembic - please adjust! ###
    op.create_table('Users',
    sa.Column('id', sa.BIGINT(), nullable=False),
    sa.Column('username', sa.String(length=30), nullable=False),
    sa.Column('fisrt_name', sa.String(length=64), nullable=False),
    sa.Column('last_name', sa.String(length=64), nullable=False),
    sa.Column('signed', sa.TIMESTAMP(timezone=True), nullable=False),
    sa.PrimaryKeyConstraint('id')
    )
    op.create_table('Aliases', #11 строка
    sa.Column('id', sa.Integer(), nullable=False),
    sa.Column('name', sa.String(), nullable=False),
    sa.Column('category_id', sa.Integer(), nullable=False),
    sa.ForeignKeyConstraint(['category_id'], ['Category.id'], ),
    sa.PrimaryKeyConstraint('id')
    )
    op.drop_table('User')
    op.add_column('Category', sa.Column('id', sa.Integer(), nullable=False)) #18 строка
    op.add_column('Category', sa.Column('user_id', sa.BIGINT(), nullable=False))
    op.create_foreign_key(None, 'Category', 'Users', ['user_id'], ['id'])
    op.drop_column('Category', 'is_base_expanse')
    op.drop_column('Category', 'codename')
    op.drop_column('Category', 'aliases')
    op.add_column('Expense', sa.Column('category_id', sa.Integer(), nullable=False))
    op.drop_constraint('Expense_category_codename_fkey', 'Expense', type_='foreignkey')
    op.create_foreign_key(None, 'Expense', 'Category', ['category_id'], ['id'])
    op.drop_column('Expense', 'category_codename')
    # ### end Alembic commands ###


В 11 строке создается таблица Aliases, в которой должен быть столбец category_id с внешним ключом, ссылающимся на столбец id таблицы Category. Но проблема в том, что в этой миграции создание столбца Category.id по порядку идет после создания таблицы Alilases (в 18 строке), поэтому я получаю ошибку:

sqlalchemy.exc.ProgrammingError: (sqlalchemy.dialects.postgresql.asyncpg.ProgrammingError) <class 'asyncpg.exceptions.UndefinedColumnError'>: column "id" referenced in foreign key constraint does not exist


Я могу поменять порядок вручную в миграции, но скорее всего я что-то не понимаю или неправильно делаю, потому что, по идее, он должен автоматически создавать миграцию с командами в нужном порядке (я так думаю, конечно могу ошибаться).

Спасибо за потраченное время
  • Вопрос задан
  • 387 просмотров
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 1
@AllocBoe
Если ещё актуально, покажите сами модели таблиц, скорее всего попутали что-то с relations()
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы