Connecting "Writing your first Django app, part 2" to Oracle Autonomous Database

Has anyone been able to get the basic tutorial app connected to an Oracle Autonomous Database?

I have a separate user created with all the proper grants I believe. but I keep getting the following error.

(venv) me@computer mysite % python3 manage.py migrate
Traceback (most recent call last):
  File "/Users/me/Projects/ExamplesBeforeGitHub/mysite/venv/lib/python3.11/site-packages/django/db/backends/oracle/base.py", line 52, in <module>
    import cx_Oracle as Database
ModuleNotFoundError: No module named 'cx_Oracle'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/Users/me/Projects/ExamplesBeforeGitHub/mysite/manage.py", line 22, in <module>
    main()
  File "/Users/me/Projects/ExamplesBeforeGitHub/mysite/manage.py", line 18, in main
    execute_from_command_line(sys.argv)
  File "/Users/me/Projects/ExamplesBeforeGitHub/mysite/venv/lib/python3.11/site-packages/django/core/management/__init__.py", line 446, in execute_from_command_line
    utility.execute()
  File "/Users/me/Projects/ExamplesBeforeGitHub/mysite/venv/lib/python3.11/site-packages/django/core/management/__init__.py", line 420, in execute
    django.setup()
  File "/Users/me/Projects/ExamplesBeforeGitHub/mysite/venv/lib/python3.11/site-packages/django/__init__.py", line 24, in setup
    apps.populate(settings.INSTALLED_APPS)
  File "/Users/me/Projects/ExamplesBeforeGitHub/mysite/venv/lib/python3.11/site-packages/django/apps/registry.py", line 116, in populate
    app_config.import_models()
  File "/Users/me/Projects/ExamplesBeforeGitHub/mysite/venv/lib/python3.11/site-packages/django/apps/config.py", line 304, in import_models
    self.models_module = import_module(models_module_name)
                         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/importlib/__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "<frozen importlib._bootstrap>", line 1206, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1178, in _find_and_load
  File "<frozen importlib._bootstrap>", line 1149, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 690, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 940, in exec_module
  File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
  File "/Users/me/Projects/ExamplesBeforeGitHub/mysite/venv/lib/python3.11/site-packages/django/contrib/auth/models.py", line 3, in <module>
    from django.contrib.auth.base_user import AbstractBaseUser, BaseUserManager
  File "/Users/me/Projects/ExamplesBeforeGitHub/mysite/venv/lib/python3.11/site-packages/django/contrib/auth/base_user.py", line 49, in <module>
    class AbstractBaseUser(models.Model):
  File "/Users/me/Projects/ExamplesBeforeGitHub/mysite/venv/lib/python3.11/site-packages/django/db/models/base.py", line 141, in __new__
    new_class.add_to_class("_meta", Options(meta, app_label))
  File "/Users/me/Projects/ExamplesBeforeGitHub/mysite/venv/lib/python3.11/site-packages/django/db/models/base.py", line 369, in add_to_class
    value.contribute_to_class(cls, name)
  File "/Users/me/Projects/ExamplesBeforeGitHub/mysite/venv/lib/python3.11/site-packages/django/db/models/options.py", line 235, in contribute_to_class
    self.db_table, connection.ops.max_name_length()
                   ^^^^^^^^^^^^^^
  File "/Users/me/Projects/ExamplesBeforeGitHub/mysite/venv/lib/python3.11/site-packages/django/utils/connection.py", line 15, in __getattr__
    return getattr(self._connections[self._alias], item)
                   ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^
  File "/Users/me/Projects/ExamplesBeforeGitHub/mysite/venv/lib/python3.11/site-packages/django/utils/connection.py", line 62, in __getitem__
    conn = self.create_connection(alias)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/me/Projects/ExamplesBeforeGitHub/mysite/venv/lib/python3.11/site-packages/django/db/utils.py", line 208, in create_connection
    backend = load_backend(db["ENGINE"])
              ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/me/Projects/ExamplesBeforeGitHub/mysite/venv/lib/python3.11/site-packages/django/db/utils.py", line 113, in load_backend
    return import_module("%s.base" % backend_name)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/importlib/__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/me/Projects/ExamplesBeforeGitHub/mysite/venv/lib/python3.11/site-packages/django/db/backends/oracle/base.py", line 54, in <module>
    raise ImproperlyConfigured("Error loading cx_Oracle module: %s" % e)

Did you install the cx_Oracle Python library in the same virtual environment that you’re running Django in? Also see Databases | Django documentation | Django

I Ken, I do have cx_Oracle python library installed and it still doesnt work.

I also tried with oracledb as well and no luck there.

Please post the output of the following commands. (With your virtual environment active)

  • pip check
  • pip list
  • python3 manage.py check
  • python3 manage.py

(venv) michael@MacMini myprojectCOPY % pip check
No broken requirements found.
(venv) michael@MacMini myprojectCOPY % pip list
Package Version


asgiref 3.6.0
certifi 2022.12.7
cffi 1.15.1
charset-normalizer 3.1.0
cryptography 39.0.2
defusedxml 0.7.1
Django 4.0.4
django-allauth 0.52.0
idna 3.4
oauthlib 3.2.2
oracledb 1.2.2
pip 23.0.1
pycparser 2.21
PyJWT 2.6.0
python3-openid 3.2.0
requests 2.28.2
requests-oauthlib 1.3.1
setuptools 65.5.0
sqlparse 0.4.3
urllib3 1.26.14
(venv) michael@MacMini myprojectCOPY % python manage.py check
System check identified no issues (0 silenced).
(venv) michael@MacMini myprojectCOPY % python manage.py

Type ‘manage.py help ’ for help on a specific subcommand.

Available subcommands:

[account]
account_unsetmultipleprimaryemails

[auth]
changepassword
createsuperuser

[contenttypes]
remove_stale_contenttypes

[django]
check
compilemessages
createcachetable
dbshell
diffsettings
dumpdata
flush
inspectdb
loaddata
makemessages
makemigrations
migrate
sendtestemail
shell
showmigrations
sqlflush
sqlmigrate
sqlsequencereset
squashmigrations
startapp
startproject
test
testserver

[sessions]
clearsessions

[staticfiles]
collectstatic
findstatic
runserver
(venv) michael@MacMini myprojectCOPY %

I do not see cx_Oracle in the list of installed packages for that virtualenv.

Sorry yes, you are correct. I believe oracledb is now the recommended way to connect to oracle databases

What I see in the Django docs at Databases | Django documentation | Django and in a blog post at blogs.oracle.com -
https://blogs.oracle.com/opal/post/connecting-to-oracle-cloud-autonomous-database-with-django, both sources specify using cx_Oracle.

Unfortunately, I don’t have a way to test this myself. I don’t have access to an Oracle database anymore.

im back trying to use cx_oracle and im getting the following error. Is there an environment variable I can set that will tell Django.db.utils where to find the Oracle Client Library? I have installed the Oracle Instant Client for macOS (Intel x86) - Version 19.8.0.0.0 dmg

django.db.utils.DatabaseError: DPI-1047: Cannot locate a 64-bit Oracle Client library: "dlopen(libclntsh.dylib, 0x0001): tried: 'libclntsh.dylib' (no such file), '/System/Volumes/Preboot/Cryptexes/OSlibclntsh.dylib' (no such file), '/usr/lib/libclntsh.dylib' (no such file, not in dyld cache), 'libclntsh.dylib' (no such file), '/usr/lib/libclntsh.dylib' (no such file, not in dyld cache)". See https://cx-oracle.readthedocs.io/en/latest/user_guide/installation.html for help

Also, cx_oracle site suggests using Oracledb now.

https://cx-oracle.readthedocs.io/en/latest/

In your project settings.py file; add the following line of code. This should make it work

===settings.py====

Added for Django to recognize python driver oracledb; without having to need cx_Oracle

import sys
import oracledb
oracledb.version = “8.3.0”
sys.modules[“cx_Oracle”] = oracledb