繁体   English   中英

在 Windows 的 Django 中运行 IBM DB2 连接时出现问题

[英]Problem with running IBM DB2 connection in Django for Windows

我是 Django 的新手,正在尝试连接两个数据库。 一个是 a.sqlite3 DB,另一个是 DB2 数据库。

`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,
      },
}`

我的 sqlite3 数据库工作正常,但是当我尝试运行python manage.py testpython manage.py migrate时,我收到以下错误:

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'

在查看 IBM 网站时,看起来我需要安装 ibm_db_django,我已经完成了。 我觉得这与我的引擎的定义方式有关,就像我需要它指向计算机上的其他地方一样。 如果是这样的话,我不知道它应该在哪里。 有人可以帮我指出正确的方向吗?

python -m django --version
3.0.3

python -V
Python 3.7.7

我正在使用 64 位 python

当我将 ibm_db_django 文件夹放入 django/db/backends 目录并将我的 DB_2 连接指向它时,我收到以下错误:

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)

非常感谢。

目前(2020 年 5 月)python 模块ibm_db_django可能会在 2.0.0 以上的 Django 版本中出现问题。 有些问题有解决方法,有些则没有。

目前,github 上的ibm_db_django自述文件页面指出: “Django Framework Minimum 1.7.x and Maximum 2.0”

您写道,您的 Django 版本是 v3 可能尚未完全受ibm_db_django支持,尽管在许多情况下可以使用变通方法,甚至允许初始manage.py migrate至少在 Db2-LUW 上成功。 但存在其他问题,因此最好继续使用受支持(已测试)的 Django 最大版本 2.0.0。

当开发人员发布较新版本的ibm_db_django时,这种情况可能会改变。 请参考github 问题页面。

如果您更改 Django 版本,明智的做法是创建一个新项目( django-admin startproject ),并将您的更改合并到其settings.py文件中。

否则之前的settings.py可能会导致新的 Django 版本抛出异常。

我选择在 Python 中使用 virtualenv(通过virtualenvwrapper-win ),但虽然这是推荐的,但它不是必需的。

在 Microsoft-Windows10 x64 1909 上,以下组合导致manage.py migrate成功(尽管元数据将在默认数据库中,这可能不是您想要的):

  • python 3.7.7(64 位)

  • pip 20.1.1

  • Django 2.0.0(<= 2.2.12 适用于初始迁移)。

  • ibm-db 3.0.1

  • ibm-db-django 1.2.0.0a0

要安装 moduleName 的特定版本 xyz,首先卸载任何现有版本,然后使用python -m pip install moduleName==xyz

对于我的settings.py ,我应用了这些更改:

#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',
    }
}

上述组合允许python manage.py migrate ,只要对数据库进行正确编目即可。

如果您希望 django 元数据(8 个表)位于 Db2 数据库中(而不是在 settings.py 中标记为默认值的数据库),那么您必须更改settings.py中的默认值或使用-- database选项来manage.py migrate

当您选择 Db2 数据库来存储元数据时, manage.py migrate可能会失败(最后)并出现一个已知问题,尽管迁移实际上已经创建了所有相关的迁移,但在清理过程中会发生错误。 github 问题上显示的解决方法对于 Db2 也有效,Django 2.2.x 版本至少高达 2.2.12。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM