I am trying to integrate my Flask
project with Alembic
My application structure looks like
project/
configuration/
__init__.py
dev.py
test.py
core/
# all source code
db/
migrations/
__init__.py
alembic.ini
env.py
versions/
When I try to run the following from my db
directory, I see
File "migration/env.py", line 55, in run_migrations_online
from configuration import app, db
ImportError: No module named configuration
I tried the solution mentioned in Request a simple alembic working example for Auto Generating Migrations, but it does not work for me
My method in env.py
run_migrations_online()
with change is
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()
How can I fix this?
I did export PYTHONPATH=<path_to_project>
and ran the command again and it ran successfully
You say you run something like alembic migrate --autogenerate -m 'migration description'
from the directory project/db
and get ImportError
, right?
If so, the problem is obvious.
See: you try to import configuration
module and it results in errors. Then you put sys.path.append(os.getcwd())
- in other words, you add current directory to the system path. But what is the current directory? It's project/db
, and it doesn't have configuration
module under it, so you continue getting ImportError
.
Solution is to add to system path parent directory - project
, which contains configuration
module. Like so:
parent_dir = os.path.abspath(os.path.join(os.getcwd(), ".."))
sys.path.append(parent_dir)
We've run into the same problem, it boils down to env.py not being called by revision unless the --autogenerate
flag is set. You can test this by putting a print statement at the top of your env.py file.
We're working around it by calling with --autogenerate
then removing the generated code.
来源:https://stackoverflow.com/questions/15648284/alembic-alembic-revision-says-import-error