web-dev-qa-db-ja.com

アレンビック:アレムビックリビジョンはインポートエラーを示しています

FlaskプロジェクトをAlembicと統合しようとしています
私のアプリケーション構造は次のようになります

_project/
       configuration/
                    __init__.py
                    dev.py
                    test.py
       core/
           # all source code
       db/
         migrations/
                    __init__.py
                    alembic.ini
                    env.py
                    versions/
_

dbディレクトリから以下を実行しようとすると、次のように表示されます。

_ File "migration/env.py", line 55, in run_migrations_online
    from configuration import app, db
ImportError: No module named configuration
_

自動生成移行の簡単なアランビック作業例をリクエストする で説明した解決策を試しましたが、うまくいきません

_env.py_ run_migrations_online()の変更を加えた私のメソッドは

_def run_migrations_online():
    """Run migrations in 'online' mode.

    In this scenario we need to create an Engine
    and associate a connection with the context.

    """
    import os
    import sys

    sys.path.append(os.getcwd())
    from configuration import app, db

    alembic_config = config.get_section(config.config_ini_section)
    alembic_config['sqlalchemy.url'] = app.config['SQLALCHEMY_DATABASE_URI']
    target_metadata = db.metadata

    engine = engine_from_config(
        alembic_config,
        prefix='sqlalchemy.',
        poolclass=pool.NullPool)

    connection = engine.connect()
    context.configure(
        connection=connection,
        target_metadata=target_metadata
    )

    try:
        with context.begin_transaction():
            context.run_migrations()
    finally:
        connection.close()


if context.is_offline_mode():
    run_migrations_offline()
else:
    run_migrations_online()
_

どうすればこれを修正できますか?

24
daydreamer

やった export PYTHONPATH=<path_to_project>そしてコマンドを再度実行すると、正常に実行されました

38
daydreamer

ディレクトリ_alembic migrate --autogenerate -m 'migration description'_から_project/db_のようなものを実行し、ImportErrorを取得すると言いますよね?

もしそうなら、問題は明らかです。

参照:configurationモジュールをインポートしようとすると、エラーが発生します。次に、sys.path.append(os.getcwd())を配置します。つまり、システムパスにcurrentディレクトリを追加します。しかし、現在のディレクトリは何ですか?これは_project/db_であり、その下にconfigurationモジュールがないため、引き続きImportErrorを取得します。

解決策は、システムパスの親ディレクトリにprojectモジュールを含むconfigurationを追加することです。そのようです:

_parent_dir = os.path.abspath(os.path.join(os.getcwd(), ".."))
sys.path.append(parent_dir)
_
14
Palasaty

同じ問題が発生しました。つまり、env.pyがリビジョンによって呼び出されないということですただし--autogenerateフラグが設定されている場合を除きます。これをテストするには、env.pyファイルの先頭にprintステートメントを配置します。

--autogenerateで呼び出してから、生成されたコードを削除することで回避しています。

2