Ошибка при использовании mssql + pyodbc через sqlalchemy для подключения к MS SQL Server из Linux

У меня есть приложение Python, которое работает на машине Linux и подключается к базе данных MS SQL Server, работающей на Windows Server внутри виртуальной машины. У меня есть причины. Мое приложение выполняет несколько больших запросов и обрабатывает большой объем данных. В основном это работает нормально, но время от времени программа просто вылетает из-за следующего:

python: read.c: 207: tds_get_string: Утверждение `dest_size› = (size_t) string_len 'не выполнено.

Я не уверен, с чего начать. Трассировка стека Python отсутствует. Скорее, программа просто распечатывает вышеуказанное и завершает работу. Если бы это было обычным исключением, я мог бы его поймать и с ним справиться.

Моя строка подключения sqlalchemy:

mssql + pyodbc: // имя пользователя: пароль @ localhost: 1433 / база данных? driver = FreeTDS

Если это важно, tsql -C выдаст следующий результат:

Параметры времени компиляции (устанавливаются с помощью скрипта конфигурации)

                        Version: freetds v0.91
         freetds.conf directory: /etc/freetds
 MS db-lib source compatibility: no
    Sybase binary compatibility: yes
                  Thread safety: yes
                  iconv library: yes
                    TDS version: 4.2
                          iODBC: no
                       unixodbc: yes
          SSPI "trusted" logins: no
                       Kerberos: yes

Я предполагаю, что моя проблема - результат ошибки во freetds. Я установил freetds и unixodbc через apt-get на свой Linux Mint. Я установил pyodbc через pip и использую anaconda. Я экспериментировал с установкой различных версий freetds, unixodbc и pyodbc из исходников. Пока я не нашел комбинацию, которая вообще работает. Однако я действительно не знаю, что делаю. Я ищу объяснения, идеи или обходные пути. Или, конечно, простые и полные решения.


person jcrudy    schedule 18.01.2017    source источник
comment
Можете ли вы включить строку подключения? Какую версию TDS вы используете? Кроме того, для более полной трассировки стека FreeTDS вы можете включить запись ошибок в файл дампа: freetds. org / userguide / logging.htm Они должны дать некоторые подсказки.   -  person FlipperPA    schedule 19.01.2017
comment
@FlipperPA Спасибо за ссылку. Я думаю, что версия TDS находится в выводе tsql -C? Я добавлю свою строку подключения к своему вопросу.   -  person jcrudy    schedule 20.01.2017


Ответы (1)


Я нашел обходной путь: не используйте freetds. Оказывается, для Linux доступен драйвер microsoft odbc. Я выполнил инструкции здесь, чтобы установить его . Помимо прочего, мне пришлось обновить ядро, чтобы оно работало. После установки я заглянул в свой файл odbcinst.ini и обнаружил новую запись «Драйвер ODBC 13 для SQL Server». Я изменил строку подключения sqlalchemy, чтобы она соответствовала ей:

mssql + pyodbc: // имя пользователя: пароль @ localhost: 1433 / database? driver = ODBC + Driver + 13 + для + SQL + Server

и теперь вроде все работает. Драйвер microsoft кажется значительно медленнее, чем freetds (я на самом деле не рассчитал время), но я не испытываю никаких ошибок, которые были раньше.

person jcrudy    schedule 20.01.2017
comment
Это решение будет работать; У меня были проблемы с драйвером MS ODBC в прошлом, но я не пробовал самые последние версии. В более старых версиях были проблемы с любым кодом, который использовал потоки (например, manage.py runserver в Django). В FreeTDS версия TDS от tsql -C является глобальной версией по умолчанию. Если вы решите вернуться к FreeTDS, вам нужно будет включить TDS_Version=7.x в строку подключения. - person FlipperPA; 21.01.2017