Ошибка подключения к базе данных Docker Django: UNICODE с использованием кодировки ASCII ‘UTF-8’ и UNICODE ‘UTF-16LE’

#python #django #docker #pyodbc

#python #django #docker #pyodbc

Вопрос:

ОБНОВЛЕНИЕ: я добавил еще несколько строк к ошибке из odbc.log, поскольку пользователь предположил, что, возможно, проблема может быть в чем-то другом.

Я столкнулся с проблемой с docker и django при попытке подключиться к удаленной базе данных (на другом сервере).

Используя Python 3.4 и django 1.9.7. Я могу отлично выполнять runserver при локальной работе и могу подключаться с помощью tsql или pyodbc.connect() в контейнере docker. Однако при выполнении runserver в контейнере docker для проекта я получаю ошибку:

[ODBC][14][1604961520.418108][SQLDriverConnectW.c] [290]
Запись:
Connection = 0x7f48618ecba0
Окно Hdl = (nil)
Str In = [UID= {{UID}};PWD = {{пароль}};ДРАЙВЕР = FreeTDS;СЕРВЕР ={{serverIP}};DATABASE={{DatabaseName}};unicode_results=True;][длина = 110]
Str Out = (nil)
Str Out Max = 0
Str Out Ptr = (nil)
Завершение = 0
UNICODE с использованием кодировки ASCII ‘UTF-8’ и UNICODE ‘UTF-16LE’
[ODBC][14][1604961520.444358][SQLDriverConnectW.c][848]
Выход: [SQL_ERROR]
[ODBC][14][1604961520.444418][SQLDriverConnect.c] [748]
Запись:
Connection = 0x7f48618ecba0
Окно Hdl = (nil)
Str In = [UID = {{UID}};PWD={{пароль}}; ДРАЙВЕР = FreeTDS;СЕРВЕР ={{serverIP}};БАЗА ДАННЫХ ={{Имя базы данных}};unicode_results=True;][длина = 110]
Str Out = 0x7f4865297db0
Str Out Max = 2048
Str Out Ptr = (ноль)
Завершение = 0
DIAG [08001] [FreeTDS] [SQL Server] Не удается подключиться к источнику данных

Эта ошибка упоминается на https://learn.microsoft.com/en-us/sql/connect/odbc/linux-mac/known-issues-in-this-version-of-the-driver?view=sql-server-ver15 с комментарием:

Установлено более одного диспетчера драйверов, и ваше приложение использует неправильный, или диспетчер драйверов был собран неправильно.

Я перепробовал все, что мог придумать, и чувствую, что здесь я упускаю из виду что-то действительно очевидное, но мне не повезло выяснить эту ошибку, или если у меня даже используется более одного драйвера (и если да, то как это исправить).

Вот другие связанные установочные файлы, возможно, кто-то что-то заметит или у вас есть идея. Любая помощь приветствуется, спасибо за ваше время!

база данных django settings.py

 settings['DATABASES'] = {
        'default': {
            'HOST': '{{serverIP}}',
            'NAME': '{{databaseName}}',
            'ENGINE': 'sql_server.pyodbc',
            'USER': '{{UID}}',
            'PASSWORD': '{{password}}',
            'OPTIONS': {
                'unicode_results': True,
                'host_is_server': True
            }
        },
    }
  

odb.ini

 [UAT_SERVER]
Description = UAT Database
Driver = FreeTDS
Database = {{databaseName}}
Servername = UAT_SERVER //I have also tried using the server IP here with no luck
Port = 1433
TDS Version = 4.2
  

odbcinst.ini

 [ODBC]
Trace = Yes
TraceFile = /tmp/odbc.log

[FreeTDS]
Description = FreeTDS Driver
Driver = /usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so
Setup = /usr/lib/x86_64-linux-gnu/odbc/libtdsS.so
TDS_Version = 4.2
Trace = Yes
TraceFile = /tmp/freetds.log //This seems to do nothing, as no file is created.
ForceTrace = Yes
  

freetds.conf

 [UAT_SERVER]
host = {{server ip}}
port = 1433
database= {{databaseName}}
tds version = auto
  

Комментарии:

1. Возможно, я ошибаюсь, но это не похоже на ошибку Unicode, как вы подчеркнули. Это больше похоже на информацию о том, как устанавливается соединение

2. Это возможно. Это мой первый опыт настройки контейнера docker для проекта, и это был ухабистый путь. Могу ли я предоставить дополнительную информацию, которая может быть полезной?

3. Вы можете добавить odbcinst в свой проект, а затем отобразить код запуска вашего приложения (или зарегистрировать, или иным образом раскрыть) результаты, возвращенные odbcinst.j() . Это может, по крайней мере, указывать на то, что unixODBC настроен так, как вы ожидаете.

4. Я так и сделал (оказалось, что для этого необходимо перейти на python 3.5). И похоже, что мне удалось получить другую ошибку. Я заметил, что odbcinst.ini не был в ожидаемом каталоге пользователя, поэтому при создании контейнера я скопировал его. Оттуда я получил сообщение об ошибке «Невозможно подключиться: адаптивный сервер недоступен или не существует». На данный момент я отслеживаю это и прокомментирую позже! Спасибо за помощь до сих пор!

Ответ №1:

Возвращаюсь, чтобы обновить это на случай, если кто-то новичок в настройке проекта django и столкнется с этой проблемой, как я. Проблема, с которой я изначально столкнулся (проблема с unicode), вовсе не была проблемой. Я копнул немного глубже и создал файл журнала freetds, где обнаружил, что НАСТОЯЩАЯ ошибка заключалась в том, что я не определил порт в настройках django для подключения к базе данных.

Как оказалось, несмотря на использование порта по умолчанию (1433), вам НЕОБХОДИМО указать порт в настройках подключения к базе данных django. Как только я это сделал, я был готов к работе!