RHEL - 从 Windows 转换的 Django 项目抛出 django.db.utils.Error: ('IM002', '[IM002] [unixODBC][驱动程序管理器]找不到



我从以前的同事那里继承了一个Django项目。我的第一项工作是将开发版本从我们的生产Windows服务器迁移到RHEL服务器。这个Django应用程序连接到内网的Microsoft SQL Server。

我设置了与Windows上相同版本的Python和Django,安装了相同的库,固定了硬编码文件系统路径,并设置了与Windows上使用的相同的虚拟环境。

运行

python manage.py runserver

我得到错误

Performing system checks...
System check identified no issues (0 silenced).
Unhandled exception in thread started by <function wrapper at 0x7eff42540de8>
Traceback (most recent call last):
  File "/srv/P27_D19/lib/python2.7/site-packages/django/utils/autoreload.py", line 226, in wrapper
    fn(*args, **kwargs)
  File "/srv/P27_D19/lib/python2.7/site-packages/django/core/management/commands/runserver.py", line 124, in inner_run
    self.check_migrations()
  File "/srv/P27_D19/lib/python2.7/site-packages/django/core/management/base.py", line 437, in check_migrations
    executor = MigrationExecutor(connections[DEFAULT_DB_ALIAS])
  File "/srv/P27_D19/lib/python2.7/site-packages/django/db/migrations/executor.py", line 20, in __init__
    self.loader = MigrationLoader(self.connection)
  File "/srv/P27_D19/lib/python2.7/site-packages/django/db/migrations/loader.py", line 52, in __init__
    self.build_graph()
  File "/srv/P27_D19/lib/python2.7/site-packages/django/db/migrations/loader.py", line 203, in build_graph
    self.applied_migrations = recorder.applied_migrations()
  File "/srv/P27_D19/lib/python2.7/site-packages/django/db/migrations/recorder.py", line 65, in applied_migrations
    self.ensure_schema()
  File "/srv/P27_D19/lib/python2.7/site-packages/django/db/migrations/recorder.py", line 52, in ensure_schema
    if self.Migration._meta.db_table in self.connection.introspection.table_names(self.connection.cursor()):
  File "/srv/P27_D19/lib/python2.7/site-packages/django/db/backends/base/base.py", line 231, in cursor
    cursor = self.make_debug_cursor(self._cursor())
  File "/srv/P27_D19/lib/python2.7/site-packages/django/db/backends/base/base.py", line 204, in _cursor
    self.ensure_connection()
  File "/srv/P27_D19/lib/python2.7/site-packages/django/db/backends/base/base.py", line 199, in ensure_connection
    self.connect()
  File "/srv/P27_D19/lib/python2.7/site-packages/django/db/utils.py", line 94, in __exit__
    six.reraise(dj_exc_type, dj_exc_value, traceback)
  File "/srv/P27_D19/lib/python2.7/site-packages/django/db/backends/base/base.py", line 199, in ensure_connection
    self.connect()
  File "/srv/P27_D19/lib/python2.7/site-packages/django/db/backends/base/base.py", line 171, in connect
    self.connection = self.get_new_connection(conn_params)
  File "/srv/P27_D19/lib/python2.7/site-packages/sql_server/pyodbc/base.py", line 302, in get_new_connection
    timeout=timeout)
django.db.utils.Error: ('IM002', '[IM002] [unixODBC][Driver Manager]Data source name not found, and no default driver specified (0) (SQLDriverConnect)')

我已经安装了py-odbc, unixODBCunixODBC-devel。我通过主机名ping了数据库服务器,它成功地找到了该服务器。我们已经设置了身份验证,它将自动使用Active Directory进行身份验证。

我注意到,有时这个错误信息已经与freetds相关联,但freetds不是在这个应用程序的生产版本上使用,所以我不应该需要它(虽然我确实尝试安装它,它没有帮助)。

引用错误的最后一行有重要的部分——

django.db.utils.Error: ('IM002', '[IM002] [unixODBC][Driver Manager]Data source name not found, and no default driver specified (0) (SQLDriverConnect)')

这并不奇怪,FreeTDS没有在这个应用程序的生产版本中使用,因为大多数Windows用户开始(如果不是一直)使用微软内置的ODBC驱动程序(和驱动程序管理器)。

您的Linux环境可能没有完全设置好,并且看起来您没有为SQL Server安装任何ODBC驱动程序,并且如果您已经安装了一个,当然也没有配置任何dsn。

这些在Linux上是不存在的,除非您安装它们,但是PyODBC应用程序需要其中一个才能运行。

  • ODBC驱动程序管理器,如iODBC (OSS,由我的雇主OpenLink软件维护和支持)或UnixODBC(也是OSS)
  • 一个用于Microsoft SQL Server的ODBC驱动程序——无论是商业的,比如来自我雇主的,来自FreeTDS的自由/开源软件的,还是其他的

相关内容

最新更新