You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决Django连接远程Windows服务器Informix数据库的IM002错误

Django连接Informix数据库报ODBC驱动错误的解决方法

问题背景

我需要将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,选择完整安装选项。
  • 直接测试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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 02:50:27