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.

Eric Taurone
  • 137
  • 8
  • Show more of your program, what modules are imported, how do you initialize the app and the database configuration? – data_henrik May 20 '20 at 04: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. – mao May 20 '20 at 06:48
  • Hey Mao, I made those changes to my question. – Eric Taurone May 20 '20 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. – Eric Taurone May 20 '20 at 14:16
  • It's remote and Linux/Unix/Windows. – Eric Taurone May 20 '20 at 15:17
  • I tried dropping the ibm_db_django folder in the django.db.backends directory and got a new series of errors. – Eric Taurone May 20 '20 at 15:18

1 Answers1

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.

mao
  • 11,321
  • 2
  • 13
  • 29
  • Thank you so much! downgrading Django introduced some new problems, but now I'm finally able to connect to my database. :) – Eric Taurone Jun 08 '20 at 20:03