3

I'm new to Django and am trying to connect two databases. One is a .sqlite3 DB and the other is a DB2 database.

`DATABASES = {
    'default': {
            'ENGINE': 'django.db.backends.sqlite3',
            'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
        },
    'DB_2': {
      'ENGINE': 'ibm_db_django',
      'NAME': 'DB_Name',
      'USER': 'my_username',
      'PASSWORD': 'my_pass',
      'HOST': 'external_host',
      'PORT': '50001',
      'PCONNECT': True,
      },
}`

My sqlite3 DB works fine, but when I try to run python manage.py test or python manage.py migrate I get the following error:

django.core.exceptions.ImproperlyConfigured: 'ibm_db_django' isn't an available database backend.
Try using 'django.db.backends.XXX', where XXX is one of:
    'mysql', 'oracle', 'postgresql', 'sqlite3'

In looking at the IBM website, it looks like I need to install ibm_db_django, which I've done. I feel like it has to do with how my engine is defined, like I need it to point somewhere else on the computer. If that is that case, I've no clue where it's supposed to be. Could someone please help point me in the right direction?

python -m django --version
3.0.3

python -V
Python 3.7.7

I'm using 64-bit python

When I drop the ibm_db_django folder into the django/db/backends directory and point my DB_2 connection to it, I get the following errors:

Traceback (most recent call last):
  File "manage.py", line 21, in <module>
    main()
  File "manage.py", line 17, in main
    execute_from_command_line(sys.argv)
  File "C:\Users\etaurone\Anaconda3\envs\RTP_WebPage\lib\site-packages\django\core\management\__init__.py", line 401, in execute_from_command_line
    utility.execute()
  File "C:\Users\etaurone\Anaconda3\envs\RTP_WebPage\lib\site-packages\django\core\management\__init__.py", line 395, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "C:\Users\etaurone\Anaconda3\envs\RTP_WebPage\lib\site-packages\django\core\management\commands\test.py", line 23, in run_from_argv
    super().run_from_argv(argv)
  File "C:\Users\etaurone\Anaconda3\envs\RTP_WebPage\lib\site-packages\django\core\management\base.py", line 328, in run_from_argv
    self.execute(*args, **cmd_options)
  File "C:\Users\etaurone\Anaconda3\envs\RTP_WebPage\lib\site-packages\django\core\management\base.py", line 369, in execute
    output = self.handle(*args, **options)
  File "C:\Users\etaurone\Anaconda3\envs\RTP_WebPage\lib\site-packages\django\core\management\commands\test.py", line 53, in handle
    failures = test_runner.run_tests(test_labels)
  File "C:\Users\etaurone\Anaconda3\envs\RTP_WebPage\lib\site-packages\django\test\runner.py", line 684, in run_tests
    old_config = self.setup_databases(aliases=databases)
  File "C:\Users\etaurone\Anaconda3\envs\RTP_WebPage\lib\site-packages\django\test\runner.py", line 606, in setup_databases
    self.parallel, **kwargs
  File "C:\Users\etaurone\Anaconda3\envs\RTP_WebPage\lib\site-packages\django\test\utils.py", line 156, in setup_databases
    test_databases, mirrored_aliases = get_unique_databases_and_mirrors(aliases)
  File "C:\Users\etaurone\Anaconda3\envs\RTP_WebPage\lib\site-packages\django\test\utils.py", line 260, in get_unique_databases_and_mirrors
    connection = connections[alias]
  File "C:\Users\etaurone\Anaconda3\envs\RTP_WebPage\lib\site-packages\django\db\utils.py", line 207, in __getitem__
    backend = load_backend(db['ENGINE'])
  File "C:\Users\etaurone\Anaconda3\envs\RTP_WebPage\lib\site-packages\django\db\utils.py", line 111, in load_backend
    return import_module('%s.base' % backend_name)
  File "C:\Users\etaurone\Anaconda3\envs\RTP_WebPage\lib\importlib\__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1006, in _gcd_import
  File "<frozen importlib._bootstrap>", line 983, in _find_and_load
  File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 677, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 728, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "C:\Users\etaurone\Anaconda3\envs\RTP_WebPage\lib\site-packages\django\db\backends\ibm_db_django\base.py", line 53, in <module>
    import ibm_db_django.pybase as Base
  File "C:\Users\etaurone\Anaconda3\envs\RTP_WebPage\lib\site-packages\ibm_db_django\pybase.py", line 38, in <module>
    from django.utils import six
ImportError: cannot import name 'six' from 'django.utils' (C:\Users\etaurone\Anaconda3\envs\RTP_WebPage\lib\site-packages\django\utils\__init__.py)

Thank you very much.

6
  • Show more of your program, what modules are imported, how do you initialize the app and the database configuration? Commented May 20, 2020 at 4:15
  • Please EDIT your questions to add details in plain text (not pictures). The output of python -m django --version , and the output of python -V . Also is it 32-bit python or 64-bit python? DETAILS are essential because module ibm_db_django does not currently support recent versions of django or python. Commented May 20, 2020 at 6:48
  • Hey Mao, I made those changes to my question. Commented May 20, 2020 at 14:16
  • Hey data_Henrik, please forgive me, I'm still super new to Django. I'm only import the base modules that come with Django and and ibm_db_django. The second database -- the one that I'm trying to connect to but can't -- isn't a database that I'm configuring. I'm just trying to read data from it. I hope that makes sense. Commented May 20, 2020 at 14:16
  • It's remote and Linux/Unix/Windows. Commented May 20, 2020 at 15:17

1 Answer 1

2

Currently (May 2020) the python module ibm_db_django may exhibit issues with Django versions above 2.0.0. Some of the issues have workarounds, others do not.

At the present date, the ibm_db_django readme page on github states: "Django Framework Minimum 1.7.x and Maximum 2.0"

You write that your Django version is v3 which may not yet be fully supported by ibm_db_django, although workarounds are possible in many cases, even to allow the initial manage.py migrate to succeed with Db2-LUW at least. But other issues exist, so it may be wise to stay with the supported (tested) Django max release 2.0.0.

This situation may change when developers release newer versions of ibm_db_django. Please refer to the github issues page.

If you change your Django version, it is wise to make a new project (django-admin startproject), and merge your changes into its settings.py file.

Otherwise the previous settings.py may cause the new Django version to throw exceptions.

I choose to use a virtualenv in Python (via virtualenvwrapper-win) but although this is recommended, it is not essential.

On Microsoft-Windows10 x64 1909, the following combination results in successful manage.py migrate(although the metadata will be in the default database, which may not be what you want):

  • python 3.7.7 (64-bit)

  • pip 20.1.1

  • Django 2.0.0 ( <= 2.2.12 works for initial migration).

  • ibm-db 3.0.1

  • ibm-db-django 1.2.0.0a0

To install a specific version x.y.z of a moduleName, first uninstall any existing version, then use the python -m pip install moduleName==x.y.z

For my settings.py I apply these changes:

#USE_TZ = True

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'django.contrib.flatpages',
    'django.contrib.redirects',
    'django.contrib.sites',
]


DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    },
    'sample' : {
        'ENGINE'  : 'ibm_db_django',
        'NAME'    : 'sample',
        'USER'    : 'xxxxx',
        'PASSWORD': 'xxxxxxxx',
        'HOST'    : 'xxxxxxx',
        'PORT'    : '50000',
    }
}

The above combination allows the python manage.py migrate to complete without errors with a local or remote Db2-LUW database, as long as the databases are correctly catalogued.

If you want the django metadata (8 tables) to be in a Db2 database (instead of the database marked as the default in settings.py) then you must either alter the default in settings.py or use the -- database option to manage.py migrate.

When you choose the Db2 database to store the metadata, the manage.py migrate may fail (at the very end) with a known issue, although the migration has in fact created all relevant migrations, the error happens during cleanup. The workaround shown on the github issue is also effective for Db2 with Django 2.2.x releases at least up to 2.2.12.

Sign up to request clarification or add additional context in comments.

1 Comment

Thank you so much! downgrading Django introduced some new problems, but now I'm finally able to connect to my database. :)

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.