CommandError: не удается найти ревизию, обозначенную знаком "", при миграции с помощью Flask-Migrate

Я начал использовать Flask-Migrate сегодня и установил его на тестовом проекте. Однако я получаю следующую ошибку:

alembic.util.exc.CommandError: не удается найти ревизию, идентифицированную 'e39d16e62810'

Действия по воспроизведению:

  1. запустите "python create_db.py"
  2. запустите "flask db init"
  3. добавить столбец "имя" в Entry-модель
  4. запустите "flask db migrate"

РЕДАКТИРОВАТЬ: После удаления каталога migrations и повторения процесса я получаю ту же ошибку после запуска «flask db migrate». Я также пробовал использовать manage.py файл с flask-script -> та же проблема

Ошибка:

(venv_mentz) H:\Flask-API-Test>python manage.py db migrate
INFO  [alembic.runtime.migration] Context impl SQLiteImpl.
INFO  [alembic.runtime.migration] Will assume non-transactional DDL.
Traceback (most recent call last):
  File "H:\Flask-API-Test\venv_mentz\lib\site-packages\alembic\script\base.py", line 143, in _catch_revision_errors
    yield
  File "H:\Flask-API-Test\venv_mentz\lib\site-packages\alembic\script\base.py", line 206, in get_revisions
    return self.revision_map.get_revisions(id_)
  File "H:\Flask-API-Test\venv_mentz\lib\site-packages\alembic\script\revision.py", line 299, in get_revisions
    return sum([self.get_revisions(id_elem) for id_elem in id_], ())
  File "H:\Flask-API-Test\venv_mentz\lib\site-packages\alembic\script\revision.py", line 299, in <listcomp>
    return sum([self.get_revisions(id_elem) for id_elem in id_], ())
  File "H:\Flask-API-Test\venv_mentz\lib\site-packages\alembic\script\revision.py", line 304, in get_revisions
    for rev_id in resolved_id)
  File "H:\Flask-API-Test\venv_mentz\lib\site-packages\alembic\script\revision.py", line 304, in <genexpr>
    for rev_id in resolved_id)
  File "H:\Flask-API-Test\venv_mentz\lib\site-packages\alembic\script\revision.py", line 362, in _revision_for_ident
    resolved_id)
alembic.script.revision.ResolutionError: No such revision or branch 'e39d16e62810'

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "manage.py", line 14, in <module>
    manager.run()
  File "H:\Flask-API-Test\venv_mentz\lib\site-packages\flask_script\__init__.py", line 417, in run
    result = self.handle(argv[0], argv[1:])
  File "H:\Flask-API-Test\venv_mentz\lib\site-packages\flask_script\__init__.py", line 386, in handle
    res = handle(*args, **config)
  File "H:\Flask-API-Test\venv_mentz\lib\site-packages\flask_script\commands.py", line 216, in __call__
    return self.run(*args, **kwargs)
  File "H:\Flask-API-Test\venv_mentz\lib\site-packages\flask_migrate\__init__.py", line 197, in migrate
    version_path=version_path, rev_id=rev_id)
  File "H:\Flask-API-Test\venv_mentz\lib\site-packages\alembic\command.py", line 176, in revision
    script_directory.run_env()
  File "H:\Flask-API-Test\venv_mentz\lib\site-packages\alembic\script\base.py", line 425, in run_env
    util.load_python_file(self.dir, 'env.py')
  File "H:\Flask-API-Test\venv_mentz\lib\site-packages\alembic\util\pyfiles.py", line 81, in load_python_file
    module = load_module_py(module_id, path)
  File "H:\Flask-API-Test\venv_mentz\lib\site-packages\alembic\util\compat.py", line 83, in load_module_py
    spec.loader.exec_module(module)
  File "<frozen importlib._bootstrap_external>", line 678, in exec_module
  File "<frozen importlib._bootstrap>", line 205, in _call_with_frames_removed
  File "migrations\env.py", line 87, in <module>
    run_migrations_online()
  File "migrations\env.py", line 80, in run_migrations_online
    context.run_migrations()
  File "<string>", line 8, in run_migrations
  File "H:\Flask-API-Test\venv_mentz\lib\site-packages\alembic\runtime\environment.py", line 836, in run_migrations
    self.get_context().run_migrations(**kw)
  File "H:\Flask-API-Test\venv_mentz\lib\site-packages\alembic\runtime\migration.py", line 321, in run_migrations
    for step in self._migrations_fn(heads, self):
  File "H:\Flask-API-Test\venv_mentz\lib\site-packages\alembic\command.py", line 156, in retrieve_migrations
    revision_context.run_autogenerate(rev, context)
  File "H:\Flask-API-Test\venv_mentz\lib\site-packages\alembic\autogenerate\api.py", line 415, in run_autogenerate
    self._run_environment(rev, migration_context, True)
  File "H:\Flask-API-Test\venv_mentz\lib\site-packages\alembic\autogenerate\api.py", line 425, in _run_environment
    if set(self.script_directory.get_revisions(rev)) != \
  File "H:\Flask-API-Test\venv_mentz\lib\site-packages\alembic\script\base.py", line 206, in get_revisions
    return self.revision_map.get_revisions(id_)
  File "c:\users\marschall\appdata\local\programs\python\python36-32\Lib\contextlib.py", line 100, in __exit__
    self.gen.throw(type, value, traceback)
  File "H:\Flask-API-Test\venv_mentz\lib\site-packages\alembic\script\base.py", line 174, in _catch_revision_errors
    compat.raise_from_cause(util.CommandError(resolution))
  File "H:\Flask-API-Test\venv_mentz\lib\site-packages\alembic\util\compat.py", line 194, in raise_from_cause
    reraise(type(exception), exception, tb=exc_tb, cause=exc_value)
  File "H:\Flask-API-Test\venv_mentz\lib\site-packages\alembic\util\compat.py", line 187, in reraise
    raise value.with_traceback(tb)
  File "H:\Flask-API-Test\venv_mentz\lib\site-packages\alembic\script\base.py", line 143, in _catch_revision_errors
    yield
  File "H:\Flask-API-Test\venv_mentz\lib\site-packages\alembic\script\base.py", line 206, in get_revisions
    return self.revision_map.get_revisions(id_)
  File "H:\Flask-API-Test\venv_mentz\lib\site-packages\alembic\script\revision.py", line 299, in get_revisions
    return sum([self.get_revisions(id_elem) for id_elem in id_], ())
  File "H:\Flask-API-Test\venv_mentz\lib\site-packages\alembic\script\revision.py", line 299, in <listcomp>
    return sum([self.get_revisions(id_elem) for id_elem in id_], ())
  File "H:\Flask-API-Test\venv_mentz\lib\site-packages\alembic\script\revision.py", line 304, in get_revisions
    for rev_id in resolved_id)
  File "H:\Flask-API-Test\venv_mentz\lib\site-packages\alembic\script\revision.py", line 304, in <genexpr>
    for rev_id in resolved_id)
  File "H:\Flask-API-Test\venv_mentz\lib\site-packages\alembic\script\revision.py", line 362, in _revision_for_ident
    resolved_id)
alembic.util.exc.CommandError: Can't locate revision identified by 'e39d16e62810'

Моя файловая структура выглядит так:

app
-- views
----- __init__.py
----- main.py
-- __init__.py
-- config.py
-- models.py
instance
-- __init__.py
-- config.py
create_db.py
dev.db
run.py

Моя фабрика приложений:

from flask import Flask
from instance.config import app_config
from flask_migrate import Migrate

def create_app(config_name):
    """ Creates a runnable app.
        This app will be using the config with name "config_name".
    """
    app = Flask(__name__)
    # Loading the the config from instance folder with name "config_name"
    app.config.from_object(app_config[config_name])
    # Loading generic config from 'config.py'
    app.config.from_pyfile('config.py')

    # Registering this app at db
    from app.models import db
    db.init_app(app)
    migrate = Migrate(app, db)

    from app import models, views

    return app

Мой run.py:

""" This script runs a the app with the given configuration. """

from app import create_app

# Configuration used to run the app
config_name = 'dev'

# Creating the app by using the required configuration
app = create_app(config_name)

if __name__ == '__main__':
    app.run()

И мой файл create_db.py для создания базы данных с помощью models.py:

""" This script creates the database defined in app.models. """

from app import create_app

app = create_app('dev')
from app.models import db

# Telling SQLAlchemy what app should be used as the database model
with app.app_context():
    db.create_all()

Это мой models.py:

from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

class Entry(db.Model):
    __tablename__ = 'Entries'
    layer_id = db.Column(db.Integer, primary_key=True)

    def __repr__(self):
        return "ID: {}; text: {}".format(self.layer_id, self.text)

РЕДАКТИРОВАТЬ: manage.py:

from flask_script import Manager
from flask_migrate import Migrate, MigrateCommand
from app import create_app
from app import models
from app.models import db

app = create_app('dev')
migrate = Migrate(app, db)
manager = Manager(app)

manager.add_command('db', MigrateCommand)

if __name__ == '__main__':
    manager.run()

person Tobias Marschall    schedule 05.12.2017    source источник
comment
вы можете проверить, есть ли у вас папка миграции в каталоге вашего приложения?   -  person Espoir Murhabazi    schedule 05.12.2017
comment
Вначале нет / не было папки миграции. Однако он создается при запуске flask db init   -  person Tobias Marschall    schedule 05.12.2017
comment
Удалите каталог migrations и повторите весь процесс еще раз. Если вы получили сообщение об ошибке, добавьте команду, которая вызвала ошибку, вместе с полным выводом к вашему вопросу.   -  person Miguel    schedule 06.12.2017
comment
Я уже пытался удалить каталог миграции, но не решил проблему.   -  person Tobias Marschall    schedule 06.12.2017


Ответы (10)


вы удаляете каталог миграции, но версия была сохранена в базе данных, поэтому вам нужно удалить информацию о версии в базе данных, запустить

delete from alembic_version;

в оболочке mysql.

Как было предложено @mirekphd, если это среда разработки или отдельное приложение для тестирования, просто удалите его, иначе BACKUP данных в таблице.

person Carl Lee    schedule 28.03.2018
comment
Это сработало для меня !. запустите DELETE FROM alembic_version на терминале db на вашем локальном компьютере или на сервере. Спасибо. - person Bi Wu; 11.03.2020
comment
Сделайте копию этого существующего alembic_version, потому что это наверняка сломает другое приложение, которое ожидает, что ваша база данных будет иметь неправильную версию, которую вы удаляете. - person mirekphd; 30.08.2020

В моем случае я случайно удалил самый последний файл миграции, но таблица алембической версии (alembic_version) относится к удаленной версии.

Поэтому вместо удаления всей базы данных вы можете изменить поле version_num в таблице alembic_version.

Для меня сработали следующие шаги:

  • Найдите голову, используя db history
  • Обновите поле version_num до заголовка версии.
  • запустить миграцию с помощью db migrate
  • обновить базу данных db upgrade
person Saji Xavier    schedule 07.12.2019
comment
Это правильный ответ и шаги, которые необходимо выполнить, если вы не хотите сбрасывать всю базу данных - person kunal pareek; 12.05.2020
comment
Я не могу воспроизвести это решение. Моя задача немного другая. У меня есть веб-приложение, которое очень хорошо работает локально на localhost. Проблема возникает, когда он развертывается на Heroku. Каждая попытка запустить heroku run flask db upgrade возвращает ERROR [root] Error: Can't locate revision identified by 'b824fd5038af'. Это после удаления миграций и app.db файлов и повторного выполнения миграций. Итак, даже когда я запускаю heroku run flask db history, я вижу, что версии b824fd5038af не существует. Любые дальнейшие попытки останавливаются этой проблемой - person Gitau Harrison; 19.11.2020
comment
Это правильный ответ, и его следует поставить ПЕРВЫМ - я сделал ошибку и не прокрутил вниз до этого ответа, поэтому выяснил это сам, мог бы сэкономить мне полчаса! - person Danny Mor; 03.05.2021

Я пробую это на колбе, и она решает!

python app.py db revision --rev-id e39d16e62810
python app.py db migrate
python app.py обновление базы данных

person Josie Koay    schedule 09.04.2021

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

person Joflix Owuor    schedule 13.08.2019

Я нашел решение. Моя ошибка .... неверный путь к базе данных. В любом случае спасибо.

person Tobias Marschall    schedule 06.12.2017

Удаление записи истории из базы данных решит проблему.

Ошибка: alembic.util.exc.CommandError: не удается найти версию, идентифицированную "e39d16e62810"

select * from alembic_version where verion_num='e39d16e62810'

Затем удалите эту запись:

delete from alembic_version where verion_num='e39d16e62810'
person Ramesh Ponnusamy    schedule 09.07.2020
comment
удалить версию можно только в том случае, если вы хотите начать с самого начала. Вы должны добавить это в описание! исключение может возникнуть, если у вас есть несогласованное состояние / поврежденное состояние, и в этом случае вы должны использовать историю, мигрировать и обновлять, чтобы исправить это - person Danny Mor; 03.05.2021

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

person rahul verma    schedule 21.06.2019

В моем случае причиной ошибки был относительный путь к sqlite db.

Исправлено указанием абсолютного пути

app.config['SQLALCHEMY_DATABASE_URI'] = f"sqlite:///{os.path.join(os.path.dirname(__file__), os.path.pardir, 'db.sqlite')}"

person Levon    schedule 31.10.2019

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

Сообщение об ошибке:

ОШИБКА [корень] Ошибка: не удается найти версию, идентифицированную "a80ab7ca5e1a"

Причина: моя строка подключения была:

mysql + pymysql: // kaunda: kaunda @ localhost: 3306 / smis

Вместо

mysql + pymysql: // kaunda: kaunda @ localhost: 3306 / WorkFolder

Ревизия, обозначенная как «a80ab7ca5e1a», принадлежит базе данных «smis», а не «WorkFolder».

person Kaunda    schedule 11.03.2020
comment
Приведите соответствующий пример. - person Kishan Mehta; 11.03.2020

Еще одна причина проблем - создание двух флеш-проектов в одной виртуальной среде.

Я пытался сделать фальшивый проект-близнец для тестирования производительности.

  • скопировал важные части оригинального проекта
  • создана новая база данных
  • внесены изменения в файл конфигурации, чтобы указать на новую базу данных
  • flask db init,
  • flask db migrate
  • получил эту ошибку при первой миграции.

Затем я сделал только одно - создал новую среду Python для этого проекта-близнеца - и ошибка исчезла.

PS. Возможно, можно создать два проекта фляги в одной среде, но я не смог найти решения.

person dankal444    schedule 19.06.2020