【问题标题】:CommandError: Can't locate revision identified by '...' when migrating using Flask-MigrateCommandError:使用 Flask-Migrate 迁移时找不到由“...”标识的修订
【发布时间】:2018-05-19 06:12:50
【问题描述】:

我今天开始使用 Flask-Migrate,并将其安装在一个测试项目中。 但是我收到以下错误:

alembic.util.exc.CommandError:找不到由 'e39d16e62810'

重现步骤:

  1. 运行“python create_db.py”
  2. 运行“flask db init”
  3. 将“名称”列添加到 Entry-model
  4. 运行“flask db migrate”

编辑: 删除migrations 目录并重复该过程后,我在运行“flask db migrate”后遇到了同样的错误。 我还尝试使用带有flask-script的manage.py文件-->同样的问题

错误:

(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()

【问题讨论】:

  • 您能检查一下您的应用程序目录中是否有迁移文件夹吗?
  • 一开始有/没有迁移文件夹。但是它是在运行“flask db init”时创建的
  • 请删除migrations目录,然后再重复整个过程。如果您收到错误,请在您的问题中添加给出错误的命令以及完整的输出。
  • 我已经尝试删除迁移目录,但我没有解决问题。
  • 我在修改我的 models.py 并尝试第二次迁移时遇到了同样的问题。问题是当你第一次点击 flask db init 时,它会创建一个名为 alembic_version 的表,你应该从数据库中删除该表,问题将得到解决。

标签: python flask flask-sqlalchemy flask-migrate


【解决方案1】:

我找到了解决方案。我的错误....数据库路径错误。还是谢谢你。

【讨论】:

    【解决方案2】:

    你删除了迁移目录但版本已经保存在数据库中,所以你必须删除数据库中的版本信息, 运行

    delete from alembic_version;

    在 mysql shell 中。

    正如@mirekphd 所建议的,如果这是一个开发环境或单个应用程序进行测试,只需将其删除,否则备份表中的数据。

    【讨论】:

    • 这对我有用!。在本地或服务器上的 db 终端上运行“DELETE FROM alembic_version”。谢谢。
    • 复制现有的alembic_version,因为这肯定会破坏其他应用程序,该应用程序希望您的数据库具有您要删除的“错误”版本。
    • REFER @Saji ANSWER,它会在不破坏数据库的情况下帮助您解决问题。
    【解决方案3】:

    在我的情况下,由于我处于初始阶段,我可以直接删除数据库文件,即在我的项目文件夹中有一个 .sqlite 文件,所以我通过右键单击将其删除。 但请记住,我处于初始阶段,所以如果你是,我不会建议这个 不在开始阶段。

    【讨论】:

      【解决方案4】:

      大多数情况下,如果您处于开发阶段,没有太多数据可以丢失,您可以删除数据库并创建一个新数据库,或者,您可以删除迁移并开始整个迁移再次循环,对于 sqlite,这就是删除应用程序中的 sqlite 文件,然后再次开始这个循环。我希望尽快找到解决此问题的最佳方法。

      【讨论】:

        【解决方案5】:

        对于我来说,错误的原因是 sqlite db 的相对路径。

        通过指定绝对路径修复它

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

        【讨论】:

          【解决方案6】:

          就我而言,我不小心删除了最新的迁移文件,但 alembic 版本 (alembic_version) 表引用了已删除的版本。

          因此,您可以更改 alembic_version 表中的 version_num 字段,而不是删除整个数据库。

          以下步骤对我有用:

          • 使用db history查找头部
          • 将 version_num 字段更新为头版本。
          • 使用db migrate运行迁移
          • 升级数据库db upgrade

          【讨论】:

          • 如果您不想转储整个数据库,这是正确的答案和步骤
          • 我无法重现此解决方案。我的挑战有点不同。我有一个在本地主机上运行良好的网络应用程序。当它被部署到 Heroku 时,问题就来了。每次尝试运行heroku run flask db upgrade 都会返回ERROR [root] Error: Can't locate revision identified by 'b824fd5038af'。这是在删除迁移和 app.db 文件并重新运行迁移之后。所以,即使我运行heroku run flask db history,我也可以看到版本'b824fd5038af'` 不存在。此问题会阻止任何进一步的尝试
          • 这是正确的答案,应该放在第一位 - 我犯了一个错误,没有向下滚动到这个答案,所以我自己发现了这个,本可以为我节省半个小时!
          • 这是正确的做法!
          【解决方案7】:

          我收到了相同的错误消息,但在我的情况下,这是因为我在连接字符串中使用了错误的数据库名称。检查你的连接字符串

          错误信息:

          ERROR [root] 错误:找不到由“a80ab7ca5e1a”标识的修订版

          原因: 我的连接字符串是:

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

          代替

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

          “a80ab7ca5e1a”标识的修订属于数据库“smis”而不是“WorkFolder”

          【讨论】:

          • 请提供适当的例子。
          【解决方案8】:

          另一个问题的原因 - 在同一个虚拟环境中制作两个烧瓶项目。

          我试图制作假双胞胎项目来进行性能测试。

          • 复制了原始项目的关键部分
          • 创建新数据库
          • 在配置文件中进行了更改以指向新数据库
          • flask db init,
          • flask db migrate
          • 第一次迁移时遇到此错误。

          然后我只做了一件事——为这个孪生项目创建了新的 python 环境——并且错误消失了。

          PS。也许可以在同一个环境中创建两个烧瓶项目,但我找不到解决方案。

          【讨论】:

            【解决方案9】:

            从数据库中删除历史条目将解决问题。

            错误:alembic.util.exc.CommandError:找不到由“e39d16e62810”标识的修订版

            select * from alembic_version where verion_num='e39d16e62810'
            

            选项 1:使用您的最新修订 ID 更新记录

            update alembic_version set verion_num='<your_verion_num>' where verion_num='e39d16e62810'
            

            选项 2:删除此记录:

            delete from alembic_version where verion_num='e39d16e62810'
            

            【讨论】:

            • 删除版本只有在你想从头开始时才可以。你应该在描述中添加它!如果您的状态不一致/损坏状态,则可能会引发异常,在这种情况下,您应该使用历史记录、迁移和升级来修复该问题
            【解决方案10】:

            我在烧瓶上试试这个,它解决了!

            python app.py 数据库修订版--rev-id e39d16e62810
            python app.py db 迁移
            python app.py 数据库升级

            【讨论】:

              猜你喜欢
              • 2020-03-15
              • 1970-01-01
              • 2021-11-08
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2019-01-17
              • 1970-01-01
              • 2020-01-05
              相关资源
              最近更新 更多