5

私の質問は多かれ少なかれLinux で実行されている django から SQL Server にクエリを実行しようとしています - Can't open lib '/path/to/libtdsodbc.so' の複製だと思いますが、そこの答えはまったく役に立ちません。

私は次のものを使用しています:

  1. Ubuntu 15.04
  2. Python3
  3. Django 1.9(pip3経由でインストール)
  4. freetds-dev 0.91-6build1apt-get でインストール
  5. django-pyodbc-azure/ django-pyodbcpip3 経由でインストール
  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
        }
    }
}

私の仮定ではDRIVER、接続 str の部分は odbc ドライバーの実行可能ファイルへの完全修飾パスである必要があり、現在はファイルとして存在しない「FreeTDS」に設定されています。私の質問は次のとおりです。

  1. 私の仮定が正しい場合、ドライバーの値を変更するにはどうすればよいですか?
  2. 私の仮定が間違っている場合、実際に間違っているのは何ですか?どうすればこれを解決できますか?
4

2 に答える 2

7

I needed to do the following:

  1. sudo apt-get install tdsodbc
  2. edit /etc/odbcinst.ini to include the following:

.

  [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

And it worked.

于 2015-12-23T18:46:52.570 に答える
3

上記の [FreeTDS] 構成は非常に役立ちます。

settings.py DATABASE セッションでは、ドライバーのバージョンと unicode 結果のセットアップも追加します。これが私の設定です:

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

SQL Express の場合、そのインスタンスをリモート接続で使用できるようにする方法を Google 検索する必要もあります。

于 2016-04-27T17:39:23.837 に答える