Невозможно перенести или обновить базу данных с помощью Flask-Migrate (Alembic)

Я использую Flask-Migrate (Alembic) для обновления своей базы данных. Я обновил свой models.py файл, но допустил ошибку. Я выполнил миграцию и пошел обновлять базу данных, однако получил эту ошибку:

sqlalchemy.exc.IntegrityError: (_mysql_exceptions.IntegrityError) (1215, 'Cannot add foreign key constraint') [SQL: u'\nCREATE TABLE topics (\n\tid INTEGER NOT NULL AUTO_INCREMENT, \n\t`subjectID` INTEGER, \n\ttopic VARCHAR(150) NOT NULL, \n\tPRIMARY KEY (id), \n\tFOREIGN KEY(`subjectID`) REFERENCES subjects (id)\n)\n\n']

Я использовал db.Text вместо db.Integer для внешнего ключа.

Когда я пытаюсь запустить новую миграцию, я получаю следующее:

alembic.util.CommandError: Target database is not up to date.

Так что теперь я застрял. Я не могу обновить базу данных или запустить миграцию. Я попытался перейти на более старую версию базы данных, используя что-то вроде этого:

python manage.py db downgrade --sql b877018671c:36949b1cca31

Но когда я запускаю python manage.py db current, я получаю самую новую версию базы данных, в которой я застрял.

Это можно как-то исправить? Спасибо.


person Pav Sidhu    schedule 26.09.2015    source источник
comment
Похоже, у вас есть миграция (плохая), которую вы еще не запускали. Либо отредактируйте его, чтобы он был правильным, либо удалите его и снова сгенерируйте миграцию.   -  person dirn    schedule 26.09.2015
comment
Как удалить миграцию?   -  person Pav Sidhu    schedule 26.09.2015
comment
Миграции - это просто файлы. Вам просто нужно удалить файл. Flask-Migrate обычно хранит их внутри migrations/version.   -  person dirn    schedule 26.09.2015
comment
Я нашел последний файл миграции и удалил его, однако, когда я пытаюсь запустить миграцию, мне все равно удается получить Target database is not up to date.   -  person Pav Sidhu    schedule 26.09.2015


Ответы (4)


Alembic сохраняет версию db в создаваемой им таблице с именем alembic_version. Эта таблица содержит одно поле и строку alembic_version.version_num. Убедитесь, что значение этого параметра совпадает с именем самого последнего файла в migrations/version. Этот номер версии также содержится внутри файла ревизии в переменной revision, которая обычно отображается в строке 26 файла. Убедитесь, что он соответствует версии db.

Другой вариант - просто удалить базу данных и воссоздать ее с помощью alembic. Если это среда разработки, где данные не важны, это была бы моя рекомендация.

person Kelly Keller-Heikkila    schedule 27.09.2015
comment
У меня была такая же проблема, и ваше решение сработало, но я запутался в одном вопросе. На самом деле, я случайно запустил одну и ту же команду migrate дважды, поэтому в моей папке migrations / versions были созданы две одинаковые миграции, первая фактически отражала изменения в моей модели, вторая была пуста. Как вы думаете, из-за этого у меня возникла эта проблема? Потому что, когда я проверил alembic_version, число соответствовало первой миграции, но не второй - person Humoyun Ahmad; 18.01.2017
comment
Это не должно вызвать проблем, поскольку, если вы откроете второй скрипт миграции, вы увидите, что он на самом деле ничего не делает. Если у вас ОКР (как и у меня), вы можете удалить второй файл миграции, который не нужен. Просто убедитесь, что значение alembic_version.version_num совпадает с именем файла первого (правильного) сценария миграции. - person Kelly Keller-Heikkila; 18.01.2017
comment
Этот подход в конечном итоге сработал для меня. Моя таблица alembic_versions была пустой, поэтому я пошел дальше и вручную вставил значение последнего имени файла миграции, и команда migrate сработала :) - person kip2; 02.05.2018
comment
Мне трудно воспроизвести это решение. Локально у меня этой проблемы ERROR [root] Error: Can't locate revision identified by '... нет. Однако любые попытки обновить таблицы на Heroku после того, как я разверну приложение, тщетны. Я удалил папку миграции и файл app.db и снова запустил init, migrate и upgrade, но не могу решить ошибку heroku. - person Gitau Harrison; 19.11.2020

Мне кажется, что принятый ответ немного слишком сложен. У меня была такая же проблема, и я решил ее просто удалить миграцию, содержащую ошибки кодирования. В любом случае он вам не нужен, так как, опять же, он был неправильно закодирован. Найдите последнюю версию миграции в папке migrations/versions, удалите ее, затем снова запустите миграцию и выполните обновление. Вам не нужно удалять данные в базе данных только для их переноса.

person Taehan Stott    schedule 12.09.2016
comment
именно то, что я сделал :) - person danidee; 13.10.2016

alembic.util.CommandError: Целевая база данных устарела.

Не могли бы вы попробовать следующие шаги?

python manage.py db stamp head
python manage.py db migrate
python manage.py db upgrade

«проштамповать» таблицу изменений данной версией; не запускайте никаких миграций

person Lucien    schedule 26.12.2018
comment
Работает, и я понятия не имею, что он делает. Спасибо - person LFMekz; 28.02.2020

Первый шаг - удалить последнюю созданную версию миграции, затем вы должны использовать следующие команды:

 flask db stamp head
 flask db migrate -m "newMigration"
 flask db upgrade
person Sebastian Villacis    schedule 17.06.2020