我今天开始使用 Flask-Migrate 并将其安装在一个测试项目上。 但是我收到以下错误:
alembic.util.exc.CommandError:无法找到由 'e39d16e62810'
重现步骤:
编辑: 删除
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()
这是我的模型.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()
你删除了迁移目录,但是版本已经保存在数据库中,所以你必须删除数据库中的版本信息, 跑
delete from alembic_version;
在 mysql shell 中。
按照@mirekphd的建议,如果这是开发环境或用于测试的单个应用程序,只需删除它,否则备份表中的数据。
我在烧瓶上尝试过这个,它起作用了:
python app.py db revision --rev-id e39d16e62810
python app.py db migrate
python app.py db upgrade
就我而言,我不小心删除了最新的迁移文件,但 alembic 版本 (alembic_version) 表引用了已删除的版本。
因此,您可以更改 alembic_version 表中的 version_num 字段,而不是删除整个数据库。
以下步骤对我有用:
- 使用
找到头部db history
- 将version_num字段更新为头部版本。
- 使用
运行迁移db migrate
- 升级数据库
db upgrade
就我而言,我不小心删除了最新的迁移文件,但 alembic 版本 (alembic_version) 表引用了已删除的版本。
我尝试了以下方法:
flask db revision --rev-id [revision-id]
flask db migrate
flask db upgrade
大多数情况下会发生这种情况,如果您处于开发阶段,没有太多数据可以丢失,您可以删除数据库并创建一个新数据库,或者,您可以删除迁移并重新开始整个循环对于sqlite来说,就是删除应用程序中的sqlite文件,然后重新开始这个循环。我希望很快找到最好的解决方案。
从数据库中删除历史条目即可解决问题。
错误:alembic.util.exc.CommandError:无法找到由“e39d16e62810”标识的修订版
select * from alembic_version where version_num='e39d16e62810'
选项 1:使用您最新的修订 ID 更新记录
update alembic_version set version_num='<your_version_num>' where version_num='e39d16e62810'
选项2:删除此记录:
delete from alembic_version where version_num='e39d16e62810'
我的问题是另一个 Flask 应用程序已经连接到同一个数据库,所以我刚刚创建了一个新数据库,并进行了更改:
SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:[email protected]:3306/newDataBaseName'
就我而言,错误的原因是 sqlite db 的相对路径。
通过指定绝对路径修复它
app.config['SQLALCHEMY_DATABASE_URI'] = f"sqlite:///{os.path.join(os.path.dirname(__file__), os.path.pardir, 'db.sqlite')}"
问题的另一个原因是在同一个虚拟环境中制作两个 Flask 项目。
我尝试制作假双胞胎项目来进行性能测试。
flask db init
,flask db migrate
然后我只做了一件事 - 为这个孪生项目创建了新的 python 环境 - 然后错误就消失了。
PS。也许可以在同一环境中创建两个 Flask 项目,但我找不到解决方案。
就我而言,由于我处于初始阶段,我可以直接删除数据库文件,即在我的项目文件夹中有一个 .sqlite 文件,所以我通过右键单击它来删除它。 但请记住,我正处于初始阶段,所以如果您是这样,我不会建议您这样做 还没有开始阶段。
我有相同的错误消息,但就我而言,这是因为我在连接字符串中使用了错误的数据库名称。检查您的连接字符串
错误消息:
错误 [root] 错误:无法找到由“a80ab7ca5e1a”标识的修订版
原因: 我的连接字符串是:
mysql+pymysql://kaunda:kaunda@localhost:3306/smis
而不是
mysql+pymysql://kaunda:kaunda@localhost:3306/WorkFolder
“a80ab7ca5e1a”标识的修订属于数据库“smis”而不是“WorkFolder”
在运行
set FLASK_APP=app.py
之前,请确保在 Windows 上按 export FLASK_APP=app.py
或在 MAC 上按 flask db init
,然后运行 flask db migrate -m "message"
和 flask db upgrade
。您可以查看此链接以获取更多信息https://pypi.org/project/Flask-Migrate/