5

Myślę, że moje pytanie jest mniej więcej duplikatem Trying to query SQL Server from django running on Linux - Can't open lib '/path/to/libtdsodbc.so', ale odpowiedź tam jest całkowicie nieużyteczna.Próba połączenia z MSSQL z django-pyodbc-azure skutkuje błędem znalezienia pliku

Używam następujące rzeczy:

  1. Ubuntu 15,04
  2. Python3
  3. Django 1.9 (zainstalowane poprzez pip3)
  4. freetds-dev 0.91-6build1 zainstalowane poprzez apt-get
  5. django-pyodbc-azure/django-pyodbc zainstalowane poprzez pip3
  6. MSSQL 2012

Kiedy próbuje się połączyć, robi python3 manage.py inspectdb pojawia się następujący ślad stosu:

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

Mam edytowanej base.py wydrukowania ciąg połączenia jest za pomocą, która jest:

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

Moja settings.py dla bazy danych wygląda następująco:

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

Moje założenie jest takie, że część połączenia powinna być pełną ścieżką do pliku wykonywalnego dla sterownika ODBC, a teraz jest ustawiona na "FreeTDS", która nie istnieje jako plik. Moje pytania to:

  1. Jeśli moje założenie jest poprawne, w jaki sposób mogę zmienić wartość dla sterownika?
  2. Jeśli moje założenie jest niepoprawne, co właściwie jest nie tak i jak mogę to rozwiązać?

Odpowiedz

6

Musiałem wykonać następujące czynności:

  1. sudo apt-get install tdsodbc
  2. zmienił /etc/odbcinst.ini zawierać następujące elementy:

.

[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 

I zadziałało.

3

Powyższa konfiguracja [FreeTDS] jest bardzo pomocna.

W sesji settings.py DATABASE dodałem również wersję sterowników oraz ustawienia wyników Unicode. Oto moja konfiguracja:

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

W przypadku SQL Express, musisz również wyszukać w Google, jak udostępnić tę instancję dla połączenia zdalnego.