#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. Как только я это сделал, я был готов к работе!