AnswerBun.com

Alembic. ModuleNotFoundError in env.py

Stack Overflow Asked by MrOldSir on January 13, 2021

I have foloving project structure

 --some db:
        --some db:
            --alchemy:
                -- __init__.py
            --alembic:
                -- versions
                -- env.py
                -- README.py
                -- script.py
            --migrations:
                -- __init__.py
            --models:
                -- model_1
                -- model_2
                -- __init__.py

I try to autogenerate migrations by alembic.

I have Base in __init__.py in models folder

import sqlalchemy as sa

from sqlalchemy.orm import relationship
from sqlalchemy.ext.declarative import declarative_base, declared_attr


metadata = sa.MetaData()
Base = declarative_base(metadata=metadata)

And import this is env.py

from logging.config import fileConfig

from alembic import context
from sqlalchemy import engine_from_config
from sqlalchemy import pool
from models import Base

config = context.config
fileConfig(config.config_file_name)
target_metadata = Base.metadata

So, when i import Base from models in env.py in alembic directory and try to generate automigration i have some error like

ModuleNotFoundError: No module named ‘models’

How i can fix this error?

2 Answers

The problem is that when env.py is executed, models is not in your PYTHONPATH, so it can't be imported.

With the project structure you've outlined, it might be a little hard to address; the easiest solution might be to modify your PYTHONPATH inside env.py like this:

import sys

sys.path = ['', '..'] + sys.path[1:]

from models import Base

This will add the parent directory of alembic/ to your PYTHONPATH so that it can find the models module.

Alternatively, you add the directory containing your modules to your PYTHONPATH environment variable in your shell:

$ export PYTHONPATH='/path/to/some db/some db':$PYTHONPATH

This solution is a little more brittle because you have to remember to do this each session and it will be different for each machine you intend to run Alembic on.

When I ran into this issue, the SQLAlchemy developer suggested that if I was using pip and virtual environments, I could install my project in editable mode so that it's in the system PYTHONPATH and Alembic would be able to find it from anywhere. More details are available in the Python packaging guide. For this, you'd need a setup.py for your project and you may want to change your project structure so that there's a top-level module containing things like models and alchemy. For example:

myproj/
    setup.py
    alembic/
        env.py
        migrations/
    myapp/
        __init__.py
        alchemy/
            __init__.py
        models/
            __init__.py

If this is set up correctly, you can

$ pip install -e .

from inside the myproj/ directory. Then in env.py you would then import Base like this:

from myapp.models import Base

Correct answer by darth_mall on January 13, 2021

When a module is loaded from a file in Python, __file__ is set to its path. You can then use that with other functions to find the directory that the file is located in.

Add the following line in alembic/env.py file to resolve the ModuleNotFoundError

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(BASE_DIR)

Answered by Abhishek Dhotre on January 13, 2021

Add your own answers!

Related Questions

“Live” data capable alternative for Google Earth KML

1  Asked on February 15, 2021 by christoph1197

   

React component dispatching generic payload

1  Asked on February 14, 2021 by andyroo

   

CSS animted gradient

1  Asked on February 14, 2021

     

Running a value through an array of functions

2  Asked on February 14, 2021 by lars-holdaas

   

How to revert back to python 2.7?

1  Asked on February 14, 2021 by nikhil-shrivastava

         

Using same name for attribute and getter

1  Asked on February 13, 2021 by janpeterka

     

What is the purpose to use className beside functionName using colon(:)

1  Asked on February 13, 2021 by mahedi-hasan-durjoy

 

Python: access a variable in a module from another file

2  Asked on February 13, 2021 by yeroduk

 

How to get elements of a sublist in Java

5  Asked on February 13, 2021 by alvira

     

`SyntaxError` in if-else one-liner

2  Asked on February 13, 2021 by evgeniy-golovin

         

Ask a Question

Get help from others!

© 2022 AnswerBun.com. All rights reserved. Sites we Love: PCI Database, MenuIva, UKBizDB, Menu Kuliner, Sharing RPP, SolveDir