Ответ 1
Я сделал export PYTHONPATH=<path_to_project>
и снова выполнил команду и успешно выполнил
Я пытаюсь интегрировать мой проект 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
Я попробовал решение, упомянутое в Запросить простой рабочий пример alembic для Auto Generating Migrations, но для меня это не работает
Мой метод в 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())
- другими словами, вы добавляете текущий каталог в системный путь. Но каков текущий каталог? Он 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.
Мы работаем над этим, вызывая с помощью --autogenerate
, затем удаляя сгенерированный код.