运行 Django 中用于 Windows 的 IBM DB2 连接问题
Problem with running IBM DB2 connection in Django for Windows
我是 Django 新手,正在尝试连接两个数据库。一个是 .sqlite3 数据库,另一个是 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 test
或 python 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
可能会出现 Django 2.0.0 以上版本的问题。有些问题有解决方法,有些则没有。
目前,github 上的 ibm_db_django
readme 页面指出:"Django Framework Minimum 1.7.x and Maximum 2.0"
您写道,您的 Django 版本是 v3,ibm_db_django
可能尚未完全支持,尽管在许多情况下可以使用变通方法,甚至允许初始 manage.py migrate
成功使用 Db2-至少卢瓦。但是还存在其他问题,因此最好继续使用受支持的(经过测试的)Django 最大版本 2.0.0。
当开发人员发布更新版本的 ibm_db_django
时,这种情况可能会改变。请参考github issues页面。
如果您更改 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 位)
点 20.1.1
Django 2.0.0(<= 2.2.12 适用于初始迁移)。
ibm-db 3.0.1
ibm-db-django 1.2.0.0a0
要安装 moduleName 的特定版本 x.y.z,首先卸载任何现有版本,然后使用 python -m pip install moduleName==x.y.z
对于我的 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
使用本地或远程 Db2-LUW 数据库无错误地完成,只要数据库被正确编目。
如果您希望 Django 元数据(8 个表)位于 Db2 数据库中(而不是 settings.py 中标记为默认的数据库),那么您必须更改 settings.py
中的默认值或者使用 -- database
选项到 manage.py migrate
。
当您选择 Db2 数据库来存储元数据时,manage.py migrate
可能会失败(最后)并出现已知的 issue,尽管迁移实际上已经创建了所有相关的迁移,错误发生在清理过程中。 github 问题上显示的解决方法对 Db2 with Django 2 也有效。2.x 版本至少达到 2.2.12。
我是 Django 新手,正在尝试连接两个数据库。一个是 .sqlite3 数据库,另一个是 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 test
或 python 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
可能会出现 Django 2.0.0 以上版本的问题。有些问题有解决方法,有些则没有。
目前,github 上的 ibm_db_django
readme 页面指出:"Django Framework Minimum 1.7.x and Maximum 2.0"
您写道,您的 Django 版本是 v3,ibm_db_django
可能尚未完全支持,尽管在许多情况下可以使用变通方法,甚至允许初始 manage.py migrate
成功使用 Db2-至少卢瓦。但是还存在其他问题,因此最好继续使用受支持的(经过测试的)Django 最大版本 2.0.0。
当开发人员发布更新版本的 ibm_db_django
时,这种情况可能会改变。请参考github issues页面。
如果您更改 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 位)
点 20.1.1
Django 2.0.0(<= 2.2.12 适用于初始迁移)。
ibm-db 3.0.1
ibm-db-django 1.2.0.0a0
要安装 moduleName 的特定版本 x.y.z,首先卸载任何现有版本,然后使用 python -m pip install moduleName==x.y.z
对于我的 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
使用本地或远程 Db2-LUW 数据库无错误地完成,只要数据库被正确编目。
如果您希望 Django 元数据(8 个表)位于 Db2 数据库中(而不是 settings.py 中标记为默认的数据库),那么您必须更改 settings.py
中的默认值或者使用 -- database
选项到 manage.py migrate
。
当您选择 Db2 数据库来存储元数据时,manage.py migrate
可能会失败(最后)并出现已知的 issue,尽管迁移实际上已经创建了所有相关的迁移,错误发生在清理过程中。 github 问题上显示的解决方法对 Db2 with Django 2 也有效。2.x 版本至少达到 2.2.12。