2015-12-23 18 views
5

Tôi nghĩ câu hỏi của tôi ít nhiều trùng lặp với Trying to query SQL Server from django running on Linux - Can't open lib '/path/to/libtdsodbc.so', nhưng câu trả lời hoàn toàn không hữu ích.Cố gắng kết nối với MSSQL với kết quả django-pyodbc-azure trong tập tin không tìm thấy lỗi

Tôi đang sử dụng những điều sau đây:

  1. Ubuntu 15,04
  2. Python3
  3. Django 1.9 (cài đặt qua PIP3)
  4. freetds-dev 0.91-6build1 cài đặt qua apt-get
  5. django-pyodbc-azure/django-pyodbc cài đặt qua PIP3
  6. MSSQL 2012

Khi cố gắng để kết nối, làm một python3 manage.py inspectdb tôi nhận được stack trace sau:

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)") 

tôi đã chỉnh sửa base.py để in ra chuỗi kết nối nó đang sử dụng, đó là:

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

settings.py của tôi cho các cơ sở dữ liệu trông giống như:

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 
     } 
    } 
} 

Giả thiết của tôi là phần DRIVER của đường kết nối phải là đường dẫn đầy đủ để thực thi cho trình điều khiển odbc và ngay bây giờ nó được đặt thành "FreeTDS", không tồn tại dưới dạng tệp. Câu hỏi của tôi sau đó là:

  1. Nếu giả định của tôi là chính xác, làm cách nào để thay đổi giá trị cho người lái xe?
  2. Nếu giả định của tôi không chính xác, điều gì thực sự sai, và làm cách nào để giải quyết vấn đề này?

Trả lời

6

tôi cần phải làm như sau:

  1. sudo apt-get install tdsodbc
  2. chỉnh sửa /etc/odbcinst.ini để bao gồm những điều sau đây:

.

[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 

Và nó hoạt động.

3

Cấu hình [FreeTDS] ở trên rất hữu ích.

Trong settings.py DATABASE phiên, tôi cũng thêm phiên bản trình điều khiển cũng như thiết lập kết quả unicode. Đây là cấu hình của tôi:

DATABASES = { 
    'default': { 
     'ENGINE': 'sql_server.pyodbc', 
     'NAME': 'myDataBaseNameInMSSQLServer', 
     'USER': 'mssql-user-with-SQL-authentication', 
     'PASSWORD': 'password', 
     'HOST': 'server-host-name-or-IP\\SQLEXPRESS', 
     'PORT': '1433', 
     'OPTIONS' : { 
      'AUTOCOMMIT': True, 
      'host_is_server': True, 
      'unicode_results': True, 
      'driver': 'FreeTDS', 
      'extra_params' : 'TDS_VERSION=8.0', 
      } 
    } 
} 

Đối với SQL Express, bạn cũng sẽ cần Google tìm cách tạo phiên bản đó cho kết nối từ xa.

Các vấn đề liên quan