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()
_
どうすればこれを修正できますか?
やった export PYTHONPATH=<path_to_project>
そしてコマンドを再度実行すると、正常に実行されました
ディレクトリ_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)
_
同じ問題が発生しました。つまり、env.pyがリビジョンによって呼び出されないということですただし--autogenerate
フラグが設定されている場合を除きます。これをテストするには、env.pyファイルの先頭にprintステートメントを配置します。
--autogenerate
で呼び出してから、生成されたコードを削除することで回避しています。