如何解决Django连接远程Windows服务器Informix数据库的IM002错误
问题背景
我需要将Django应用连接至安装在Windows Server 2019 Datacenter虚拟机上的Informix数据库。本地笔记本已通过DbVisualizer成功访问该数据库,且已在本地Program Files目录安装Informix Client SDK。参考django-informixdb文档配置了settings.py,配置代码如下:
DATABASES = { 'default': { 'ENGINE': 'django_informixdb', 'NAME': 'testdb', 'SERVER': "ol_test", 'HOST': '172.20.10.3', 'PORT': '9092', 'USER': 'informix', 'PASSWORD': 'test@12345', 'OPTIONS': { 'DRIVER': "C:\\Program Files\\IBM Informix Client-SDK\\bin\\iclit09b.dll", # Or iclit09b.dylib on macOS 'Setup': "C:\\Program Files\\IBM Informix Client-SDK\\bin\\iclit09b.dll", 'CPTIMEOUT': 120, 'CONN_TIMEOUT': 120, 'ISOLATION_LEVEL': 'READ_UNCOMMITTED', 'LOCK_MODE_WAIT': 0, 'VALIDATE_CONNECTION': True, }, 'CONNECTION_RETRY': { 'MAX_ATTEMPTS': 10, }, 'TEST': { 'NAME': 'testdb', 'CREATE_DB': False } } }
运行时出现如下错误:
C:\Users\test\PycharmProjects\bdm_reporting_app\bdm_reporting_app\settings.py changed, reloading. Watching for file changes with StatReloader Performing system checks... System check identified no issues (0 silenced). Exception in thread django-main-thread: Traceback (most recent call last): File "C:\Users\test\AppData\Local\Programs\Python\Python310\lib\site-packages\django\db\backends\base\base.py", line 282, in ensure_connection self.connect() File "C:\Users\test\AppData\Local\Programs\Python\Python310\lib\site-packages\django\utils\asyncio.py", line 26, in inner return func(*args, **kwargs) File "C:\Users\test\AppData\Local\Programs\Python\Python310\lib\site-packages\django\db\backends\base\base.py", line 263, in connect self.connection = self.get_new_connection(conn_params) File "C:\Users\test\AppData\Local\Programs\Python\Python310\lib\site-packages\django_informixdb\base.py", line 251, in get_new_connection self.connection = self._get_connection_with_retries(connection_string, conn_params) File "C:\Users\test\AppData\Local\Programs\Python\Python310\lib\site-packages\django_informixdb\base.py", line 299, in _get_connection_with_retries conn = pyodbc.connect(connection_string, autocommit=conn_params["AUTOCOMMIT"], pyodbc.InterfaceError: ('IM002', '[IM002] [Microsoft][ODBC Driver Manager] Data source name not found and no default driver specified (0) (SQLDriverConnect)') The above exception was the direct cause of the following exception: Traceback (most recent call last): File "C:\Users\test\AppData\Local\Programs\Python\Python310\lib\threading.py", line 1016, in _bootstrap_inner self.run() File "C:\Users\test\AppData\Local\Programs\Python\Python310\lib\threading.py", line 953, in run self._target(*self._args, **self._kwargs) File "C:\Users\test\AppData\Local\Programs\Python\Python310\lib\site-packages\django\utils\autoreload.py", line 64, in wrapper fn(*args, **kwargs) File "C:\Users\test\AppData\Local\Programs\Python\Python310\lib\site-packages\django\core\management\commands\runserver.py", line 137, in inner_run self.check_migrations() File "C:\Users\test\AppData\Local\Programs\Python\Python310\lib\site-packages\django\core\management\base.py", line 564, in check_migrations executor = MigrationExecutor(connections[DEFAULT_DB_ALIAS]) File "C:\Users\test\AppData\Local\Programs\Python\Python310\lib\site-packages\django\db\migrations\executor.py", line 18, in __init__ self.loader = MigrationLoader(self.connection) File "C:\Users\test\AppData\Local\Programs\Python\Python310\lib\site-packages\django\db\migrations\loader.py", line 58, in __init__ self.build_graph() File "C:\Users\test\AppData\Local\Programs\Python\Python310\lib\site-packages\django\db\migrations\loader.py", line 235, in build_graph self.applied_migrations = recorder.applied_migrations() File "C:\Users\test\AppData\Local\Programs\Python\Python310\lib\site-packages\django\db\migrations\recorder.py", line 81, in applied_migrations if self.has_table(): File "C:\Users\test\AppData\Local\Programs\Python\Python310\lib\site-packages\django\db\migrations\recorder.py", line 57, in has_table with self.connection.cursor() as cursor: File "C:\Users\test\AppData\Local\Programs\Python\Python310\lib\site-packages\django\utils\asyncio.py", line 26, in inner return func(*args, **kwargs) File "C:\Users\test\AppData\Local\Programs\Python\Python310\lib\site-packages\django\db\backends\base\base.py", line 323, in cursor return self._cursor() File "C:\Users\test\AppData\Local\Programs\Python\Python310\lib\site-packages\django\db\backends\base\base.py", line 299, in _cursor self.ensure_connection() File "C:\Users\test\AppData\Local\Programs\Python\Python310\lib\site-packages\django\utils\asyncio.py", line 26, in inner return func(*args, **kwargs) File "C:\Users\test\AppData\Local\Programs\Python\Python310\lib\site-packages\django\db\backends\base\base.py", line 281, in ensure_connection with self.wrap_database_errors: File "C:\Users\test\AppData\Local\Programs\Python\Python310\lib\site-packages\django\db\utils.py", line 91, in __exit__ raise dj_exc_value.with_traceback(traceback) from exc_value File "C:\Users\test\AppData\Local\Programs\Python\Python310\lib\site-packages\django\db\backends\base\base.py", line 282, in ensure_connection self.connect() File "C:\Users\test\AppData\Local\Programs\Python\Python310\lib\site-packages\django\utils\asyncio.py", line 26, in inner return func(*args, **kwargs) File "C:\Users\test\AppData\Local\Programs\Python\Python310\lib\site-packages\django\db\backends\base\base.py", line 263, in connect self.connection = self.get_new_connection(conn_params) File "C:\Users\test\AppData\Local\Programs\Python\Python310\lib\site-packages\django_informixdb\base.py", line 251, in get_new_connection self.connection = self._get_connection_with_retries(connection_string, conn_params) File "C:\Users\test\AppData\Local\Programs\Python\Python310\lib\site-packages\django_informixdb\base.py", line 299, in _get_connection_with_retries conn = pyodbc.connect(connection_string, autocommit=conn_params["AUTOCOMMIT"], django.db.utils.InterfaceError: ('IM002', '[IM002] [Microsoft][ODBC Driver Manager] Data source name not found and no default driver specified (0) (SQLDriverConnect)')
解决步骤
验证Python与Informix SDK的位数匹配
确认你的Python版本(32/64位)和安装的Informix Client SDK位数完全一致。ODBC驱动管理器仅加载同位数的驱动,不匹配会直接导致找不到驱动的错误。可以通过python -c "import struct; print(struct.calcsize('P') * 8)"查看Python位数。修正DRIVER配置参数
Windows系统中,ODBC驱动路径建议使用原始字符串或驱动名称,同时移除不必要的Setup参数:'OPTIONS': { # 优先使用驱动名称,需确保驱动已注册到ODBC管理器 'DRIVER': 'IBM Informix ODBC Driver', # 或者使用原始字符串路径避免转义问题 # 'DRIVER': r"C:\Program Files\IBM Informix Client-SDK\bin\iclit09b.dll", 'CPTIMEOUT': 120, 'CONN_TIMEOUT': 120, 'ISOLATION_LEVEL': 'READ_UNCOMMITTED', 'LOCK_MODE_WAIT': 0, 'VALIDATE_CONNECTION': True, },检查ODBC驱动是否注册成功
打开对应位数的ODBC数据源管理器:- 64位:
C:\Windows\System32\odbcad32.exe - 32位:
C:\Windows\SysWOW64\odbcad32.exe
切换到「驱动程序」标签页,确认存在「IBM Informix ODBC Driver」。如果没有,重新安装对应位数的Informix Client SDK,选择完整安装选项。
- 64位:
直接测试pyodbc连接
跳过Django,用pyodbc直接测试连接,排查底层ODBC问题:import pyodbc conn_str = ( "DRIVER={IBM Informix ODBC Driver};" "SERVER=ol_test;" "DATABASE=testdb;" "HOST=172.20.10.3;" "SERVICE=9092;" "UID=informix;" "PWD=test@12345;" ) try: conn = pyodbc.connect(conn_str) print("连接成功") conn.close() except Exception as e: print(f"连接失败: {e}")若此测试失败,重点排查驱动注册和位数匹配;若成功,再调整Django配置。
添加Informix SDK路径到系统PATH
将C:\Program Files\IBM Informix Client-SDK\bin添加到系统环境变量PATH中,然后重启PyCharm或命令行窗口,确保环境变量生效。
内容的提问来源于stack exchange,提问作者Balla

