How to Solve Error Message ModuleNotFoundError: No module named ‘psycopg2’ in Django

Posted on

Problem that appear in this article is the error message of ‘ModuleNotFoundError: No module named ‘psycopg2’. The error message shows upon executing ‘python manage.py makemigrations’ command in the command line interface. It is a command to migrate any existing models available in the Django-based web application into the associated database and tables. Unfortunately, the command failed and it triggers an error message as it exist in the title of this article. In this article, there will be several steps taken in order to solve the problem. First of all, the following is the actual execution of the command which is triggering the error message :

(myenv) c:\python-win\project>python manage.py makemigrations
Traceback (most recent call last):
File "C:\python-win\myenv\lib\site-packages\django\db\backends\postgresql\base.py", line 25, in 
import psycopg2 as Database
ModuleNotFoundError: No module named 'psycopg2'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "manage.py", line 21, in 
main()
File "manage.py", line 17, in main
execute_from_command_line(sys.argv)
File "C:\python-win\myenv\lib\site-packages\django\core\management\__init__.py", line 401, in execute_from_command_line
utility.execute()
File "C:\python-win\myenv\lib\site-packages\django\core\management\__init__.py", line 377, in execute
django.setup()
File "C:\python-win\myenv\lib\site-packages\django\__init__.py", line 24, in setup
apps.populate(settings.INSTALLED_APPS)
File "C:\python-win\myenv\lib\site-packages\django\apps\registry.py", line 114, in populate
app_config.import_models()
File "C:\python-win\myenv\lib\site-packages\django\apps\config.py", line 211, in import_models
self.models_module = import_module(models_module_name)
File "c:\python38\lib\importlib\__init__.py", line 127, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "", line 1014, in _gcd_import
File "", line 991, in _find_and_load
File "", line 975, in _find_and_load_unlocked
File "", line 671, in _load_unlocked
File "", line 783, in exec_module
File "", line 219, in _call_with_frames_removed
File "C:\python-win\myenv\lib\site-packages\django\contrib\auth\models.py", line 2, in 
from django.contrib.auth.base_user import AbstractBaseUser, BaseUserManager
File "C:\python-win\myenv\lib\site-packages\django\contrib\auth\base_user.py", line 47, in 
class AbstractBaseUser(models.Model):
File "C:\python-win\myenv\lib\site-packages\django\db\models\base.py", line 121, in __new__
new_class.add_to_class('_meta', Options(meta, app_label))
File "C:\python-win\myenv\lib\site-packages\django\db\models\base.py", line 325, in add_to_class
value.contribute_to_class(cls, name)
File "C:\python-win\myenv\lib\site-packages\django\db\models\options.py", line 208, in contribute_to_class
self.db_table = truncate_name(self.db_table, connection.ops.max_name_length())
File "C:\python-win\myenv\lib\site-packages\django\db\__init__.py", line 28, in __getattr__
return getattr(connections[DEFAULT_DB_ALIAS], item)
File "C:\python-win\myenv\lib\site-packages\django\db\utils.py", line 207, in __getitem__
backend = load_backend(db['ENGINE'])
File "C:\python-win\myenv\lib\site-packages\django\db\utils.py", line 111, in load_backend
return import_module('%s.base' % backend_name)
File "c:\python38\lib\importlib\__init__.py", line 127, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "C:\python-win\myenv\lib\site-packages\django\db\backends\postgresql\base.py", line 29, in 
raise ImproperlyConfigured("Error loading psycopg2 module: %s" % e)
django.core.exceptions.ImproperlyConfigured: Error loading psycopg2 module: No module named 'psycopg2'
(myenv) c:\python-win\project>

What is the exact database configuration for connecting Django-based web application to the PostgreSQL Database Server ?. It exist in a configuration file with the name of ‘settings.py’ in the root folder of the project. So, the location of the ‘settings.py’ in this example exist in the following tree command output :

(myenv) C:\python-win\project>tree . /f
Folder PATH listing for volume Windows
Volume serial number is xxxxxxxxxxxx
C:\PYTHON-WIN\PROJECT
│   db.sqlite3
│   manage.py
│
├───system
│   │   asgi.py
│   │   settings.py
│   │   urls.py
│   │   wsgi.py
│   │   __init__.py
│   │
│   └───__pycache__
│           settings.cpython-38.pyc
│           urls.cpython-38.pyc
│           wsgi.cpython-38.pyc
│           __init__.cpython-38.pyc
...
(myenv) C:\python-win\project>

The following is snippet code of the ‘settings.py’ containing the PostgreSQL database connection :

    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'db_app',
        'USER': 'postgres',
        'PASSWORD':'password',
        'HOST':'localhost',
        'PORT':'5432',
    }

The solution is very simple to handle the above error message. Since there is no module which is important as a requirement to finish the migration command above, just add it. So, execute the following command to add the module :

(myenv) c:\python-win\project>pip install psycopg2
Collecting psycopg2
  Downloading psycopg2-2.8.5-cp38-cp38-win_amd64.whl (1.1 MB)
     |████████████████████████████████| 1.1 MB 45 kB/s
Installing collected packages: psycopg2
Successfully installed psycopg2-2.8.5
WARNING: You are using pip version 20.1; however, version 20.1.1 is available.
You should consider upgrading via the 'c:\python-win\myenv\scripts\python.exe -m pip install --upgrade pip' command.
(myenv) c:\python-win\project>

The above output command is a command to install a new module with the name of ‘psycopg2’. Final Result :

(myenv) c:\python-win\project>python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying admin.0003_logentry_add_action_flag_choices... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying auth.0010_alter_group_name_max_length... OK
  Applying auth.0011_update_proxy_permissions... OK
  Applying sessions.0001_initial... OK
(myenv) c:\python-win\project>

Try to connect to the database to prove that the associated table and database has exist as a result of the above command execution as follows :

C:\Program Files\PostgreSQL\12\bin>psql -Upostgres
Password for user postgres:
psql (12.2)
WARNING: Console code page (437) differs from Windows code page (1252)
         8-bit characters might not work correctly. See psql reference
         page "Notes for Windows users" for details.
Type "help" for help.
postgres=# \l
                                                 List of databases
   Name    |  Owner   | Encoding |          Collate           |           Ctype            |   Access privileges
-----------+----------+----------+----------------------------+----------------------------+-----------------------
 db_app    | postgres | UTF8     | English_United States.1252 | English_United States.1252 |
 postgres  | postgres | UTF8     | English_United States.1252 | English_United States.1252 |
 template0 | postgres | UTF8     | English_United States.1252 | English_United States.1252 | =c/postgres          +
           |          |          |                            |                            | postgres=CTc/postgres
 template1 | postgres | UTF8     | English_United States.1252 | English_United States.1252 | =c/postgres          +
           |          |          |                            |                            | postgres=CTc/postgres
(4 rows)
postgres=# \c db_app
You are now connected to database "db_app" as user "postgres".
db_app=# \dt
                   List of relations
 Schema |            Name            | Type  |  Owner
--------+----------------------------+-------+----------
 public | auth_group                 | table | postgres
 public | auth_group_permissions     | table | postgres
 public | auth_permission            | table | postgres
 public | auth_user                  | table | postgres
 public | auth_user_groups           | table | postgres
 public | auth_user_user_permissions | table | postgres
 public | django_admin_log           | table | postgres
 public | django_content_type        | table | postgres
 public | django_migrations          | table | postgres
 public | django_session             | table | postgres
(10 rows)
db_app=#

Leave a Reply