python - 尝试使用 django-pyodbc-azure 连接到 MSSQL 导致找不到文件错误

标签 python sql-server django django-pyodbc django-pyodbc-azure

我认为我的问题或多或少与 Trying to query SQL Server from django running on Linux - Can't open lib '/path/to/libtdsodbc.so' 重复,但那里的答案完全没有用。

我正在使用以下东西:

  1. Ubuntu 15.04
  2. Python3
  3. Django 1.9(通过 pip3 安装)
  4. freetds-dev 0.91-6build1 通过 apt-get 安装
  5. django-pyodbc-azure/django-pyodbc 通过 pip3 安装
  6. MSSQL 2012

尝试连接时,执行 python3 manage.py inspectdb 我得到以下堆栈跟踪:

Traceback (most recent call last):
  File "/usr/local/lib/python3.4/dist-packages/django/db/backends/base/base.py", line 199, in ensure_connection
    self.connect()
  File "/usr/local/lib/python3.4/dist-packages/django/db/backends/base/base.py", line 171, in connect
    self.connection = self.get_new_connection(conn_params)
  File "/usr/local/lib/python3.4/dist-packages/sql_server/pyodbc/base.py", line 302, in get_new_connection
    timeout=timeout)
pyodbc.Error: ('01000', "[01000] [unixODBC][Driver Manager]Can't open lib 'FreeTDS' : file not found (0) (SQLDriverConnect)")

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "manage.py", line 10, in <module>
    execute_from_command_line(sys.argv)
  File "/usr/local/lib/python3.4/dist-packages/django/core/management/__init__.py", line 350, in execute_from_command_line
    utility.execute()
  File "/usr/local/lib/python3.4/dist-packages/django/core/management/__init__.py", line 342, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/usr/local/lib/python3.4/dist-packages/django/core/management/base.py", line 348, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/usr/local/lib/python3.4/dist-packages/django/core/management/base.py", line 399, in execute
    output = self.handle(*args, **options)
  File "/usr/local/lib/python3.4/dist-packages/django/core/management/commands/inspectdb.py", line 25, in handle
    for line in self.handle_inspection(options):
  File "/usr/local/lib/python3.4/dist-packages/django/core/management/commands/inspectdb.py", line 38, in handle_inspection
    with connection.cursor() as cursor:
  File "/usr/local/lib/python3.4/dist-packages/django/db/backends/base/base.py", line 231, in cursor
    cursor = self.make_debug_cursor(self._cursor())
  File "/usr/local/lib/python3.4/dist-packages/django/db/backends/base/base.py", line 204, in _cursor
    self.ensure_connection()
  File "/usr/local/lib/python3.4/dist-packages/django/db/backends/base/base.py", line 199, in ensure_connection
    self.connect()
  File "/usr/local/lib/python3.4/dist-packages/django/db/utils.py", line 95, in __exit__
    six.reraise(dj_exc_type, dj_exc_value, traceback)
  File "/usr/local/lib/python3.4/dist-packages/django/utils/six.py", line 685, in reraise
    raise value.with_traceback(tb)
  File "/usr/local/lib/python3.4/dist-packages/django/db/backends/base/base.py", line 199, in ensure_connection
    self.connect()
  File "/usr/local/lib/python3.4/dist-packages/django/db/backends/base/base.py", line 171, in connect
    self.connection = self.get_new_connection(conn_params)
  File "/usr/local/lib/python3.4/dist-packages/sql_server/pyodbc/base.py", line 302, in get_new_connection
    timeout=timeout)
django.db.utils.Error: ('01000', "[01000] [unixODBC][Driver Manager]Can't open lib 'FreeTDS' : file not found (0) (SQLDriverConnect)")

我已经编辑了 base.py 以打印出它正在使用的连接字符串,即:

DRIVER=FreeTDS;DATABASE=test;PWD=test;UID=sa;PORT=1433;SERVER=10.13.36.223

我的数据库 settings.py 如下所示:

DATABASES = {
    'default': {
        'ENGINE': 'sql_server.pyodbc',
        'NAME': 'test',
    'USER': 'sa',
    'PASSWORD': 'test',
    'HOST': '10.13.36.223',
    'PORT': '1433',
    'AUTOCOMMIT': True,
    'OPTIONS' : {
        'host_is_server': True
        }
    }
}

我的假设是连接 str 的 DRIVER 部分应该是 odbc 驱动程序的可执行文件的完全限定路径,现在它被设置为“FreeTDS”,这不是作为文件存在。那么我的问题是:

  1. 如果我的假设是正确的,我该如何更改驱动程序的值?
  2. 如果我的假设不正确,到底哪里出了问题,我该如何解决?

最佳答案

我需要执行以下操作:

  1. sudo apt-get install tdsodbc
  2. 编辑 /etc/odbcinst.ini 以包含以下内容:

.

  [FreeTDS]
  Description = TDS Driver for MSSQL
  driver = /usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so
  setup =  /usr/lib/x86_64-linux-gnu/odbc/libtdsS.so

它奏效了。

关于python - 尝试使用 django-pyodbc-azure 连接到 MSSQL 导致找不到文件错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34441627/

相关文章:

java - 关于在 3 ignite 服务器集群上使用 sql 查询获取数据的问题

python - Django 工厂男孩 : fill modelfield with choices throws error

python - 任务管理守护进程

python - 以 10 为基数的 int() 模型 Django 无效文字 : 'None'

python - 距离度量的组合优化

python - 在python中打印两个不同列表的相同索引

mysql - 如何获取各个表中使用的所有列?

sql - 将两个连续的行合并为一列

python - 该方法查找数组(python)中的反转次数的时间复杂度是多少?

python - 单引号字符串与双引号字符串