5

Ich denke, meine Frage ist mehr oder weniger ein Duplikat von Trying to query SQL Server from django running on Linux - Can't open lib '/path/to/libtdsodbc.so', aber die Antwort ist ganz und gar nicht sinnvoll.Versuch, eine Verbindung zu MSSQL mit django-pyodbc-azure führt zu Datei nicht gefunden Fehler

ich folgende Dinge bin mit:

  1. Ubuntu 15,04
  2. Python3
  3. Django 1.9 (via PIP3 installiert)
  4. freetds-dev 0.91-6build1 über installiert apt-get
  5. django-pyodbc-azure/django-pyodbc über PIP3 installiert
  6. MSSQL 2012

Bei dem Versuch, eine Verbindung, ein python3 manage.py inspectdb tat ich folgende Stack-Trace erhalten:

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

Ich habe bearbeitet base.py aus der Verbindungszeichenfolge zu drucken, ist es mit, das ist:

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

Meine settings.py für die Datenbank wie folgt aussieht:

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

Meine Annahme ist, dass der DRIVER Teil der Verbindung str sollte der voll qualifizierte Pfad zu der ausführbaren Datei für den ODBC-Treiber, und das ist jetzt auf "FreeTDS", die nicht als Datei vorhanden ist. Meine Fragen sind dann:

  1. Wenn meine Annahme richtig ist, wie ändere ich den Wert für den Fahrer?
  2. Wenn meine Annahme falsch ist, was ist eigentlich falsch, und wie löse ich das?

Antwort

6

Ich brauchte folgendes zu tun:

  1. sudo apt-get install tdsodbc
  2. bearbeiten /etc/odbcinst.ini gehören:

.

[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 

Und es hat funktioniert.

3

Die obige Konfiguration [FreeTDS] ist sehr hilfreich.

In settings.py DATABASE Sitzung, ich auch Treiber-Version sowie Unicode-Ergebnisse Setups hinzufügen. Hier ist meine config:

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

Für SQL Express, werden Sie auch die Google-Suche müssen, wie für die Fernverbindung, die Instanz zur Verfügung zu stellen.