web-dev-qa-db-ja.com

CommandError:Flask-Migrateを使用して移行する場合、「...」で識別されるリビジョンを見つけることができません

今日、Flask-Migrateの使用を開始し、テストプロジェクトにインストールしました。ただし、次のエラーが発生します。

alembic.util.exc.CommandError: 'e39d16e62810'で識別されるリビジョンが見つかりません

再現手順:

  1. 「python create_db.py」を実行します
  2. 「フラスコdb init」を実行します
  3. エントリモデルに列「名前」を追加します
  4. 「フラスコdb移行」を実行します。

編集:migrationsディレクトリを削除してプロセスを繰り返した後、「flask db migrate」を実行した後に同じエラーが発生します。また、フラスコスクリプトで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

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

models.pyを使用してデータベースを作成するためのcreate_db.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()
8

移行ディレクトリを削除したが、バージョンはデータベースに保存されているため、データベースのバージョン情報を削除し、delete from alembic_versionを実行する必要があります。

mysqlシェルで。

9
Carl Lee

ほとんどの場合、これが発生します。失うデータがあまりない開発段階にある場合は、データベースを削除して新しいデータベースを作成するか、移行を削除してサイクル全体を再び開始することができます。 sqliteの場合は、アプリケーションのsqliteファイルを削除し、このサイクルを再び開始することがすべてです。私はすぐにこのヴェリーの最善の解決策を見つけたいと思っています。

2
Joflix Owuor

私は解決策を見つけました。私の間違い....データベースへのパスが間違っていました。とにかくありがとう。

1

私の場合、最新の移行ファイルを誤って削除しましたが、alembicバージョン(alembic_version)テーブルは削除されたバージョンを参照しています。

したがって、データベース全体を削除する代わりに、alembic_versionテーブルのversion_numフィールドを変更できます。

次の手順は私のために働きました:

  • db historyを使用して頭を見つける
  • Version_numフィールドをヘッドバージョンに更新します。
  • db migrateを使用して移行を実行する
  • データベースをアップグレードするdb upgrade
0
Saji Xavier

同じエラーメッセージが表示されましたが、これは接続文字列で間違ったデータベース名を使用したことが原因です。接続文字列を確認してください

エラーメッセージ:

エラー[ルート]エラー: 'a80ab7ca5e1a'で識別されるリビジョンが見つかりません

理由:私の接続文字列は:

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

の代わりに

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

「a80ab7ca5e1a」で識別されるリビジョンは、「WorkFolder」ではなく「smis」データベースに属しています

0
Kaunda

私の場合、私は最初の段階だったので、データベースファイルを直接削除する余裕がありました。つまり、プロジェクトフォルダーに.sqliteファイルがあったため、右クリックして削除しました。ただし、私が最初のフェーズにいたことを覚えておいてください。開始フェーズにいない場合は、これをお勧めしません。

0
rahul verma

私の場合、エラーの理由はsqlite dbへの相対パスでした。

絶対パスを指定して修正

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

0
Levon