Драйвер ODBC 17 для SQL Server: Клиент не может установить соединение, macOS, django, odbc

Все работало, пока я не перезагрузил свой ноутбук.

У меня такая установка:

  • python 3.8.9
  • django 3.1.1
  • pyodbc 4.0.30
  • pyodbc.drivers() показывает следующее: ['ODBC Driver 17 for SQL Server']
  • SQLServer
  • openssl version показывает следующее: OpenSSL 1.1.1l 24 Aug 2021
  • isql -v -k "DRIVER=ODBC Driver 17 for SQL Server;SERVER=<my server>,<my port>;UID=<my username>;PWD=<my password>" подключается к базе данных без проблем
  • имя сервера, порт, пользователь и пароль, похоже, верны, так как jdbc драйвер работает с ними без проблем.
  • cat /etc/odbcinst.ini и cat /etc/odbc.ini - оба возвращают следующее:
[ODBC Driver 17 for SQL Server]
Description=Microsoft ODBC Driver 17 for SQL Server
Driver=/usr/local/lib/libmsodbcsql.17.dylib
UsageCount=10
  • odbcinst -j возвращает следующее:
unixODBC 2.3.9
DRIVERS............: /usr/local/etc/odbcinst.ini
SYSTEM DATA SOURCES: /usr/local/etc/odbc.ini
FILE DATA SOURCES..: /usr/local/etc/ODBCDataSources
USER DATA SOURCES..: /Users/sgalich/.odbc.ini
SQLULEN Size.......: 8
SQLLEN Size........: 8
SQLSETPOSIROW Size.: 8
  • в настройках django:
DATABASES = {
    'default': {
        'ENGINE': 'mssql',
        'NAME': os.environ.get('DB_NAME'),
        'USER': os.environ.get('DB_USER'),
        'PASSWORD': os.environ.get('DB_PASSWORD'),
        'HOST': os.environ.get('DB_HOST'),
        'PORT': os.environ.get('DB_PORT'),
        'OPTIONS': {
            'driver': 'ODBC Driver 17 for SQL Server',
        },
    },
}
  • cat ~/.bash_profile показывает следующее:
export PATH="/usr/local/opt/openssl@1.1/bin:$PATH"
export CPATH="/usr/local/opt/openssl@1.1/include"
export LDFLAGS="-L/usr/local/opt/openssl@1.1/lib"
export CPPFLAGS="-I/usr/local/opt/openssl@1.1/include"
export LIBRARY_PATH="/usr/local/opt/openssl@1.1/lib"
export DYLD_LIBRARY_PATH="/usr/local/opt/openssl@1.1/lib"
export DYLD_FALLBACK_LIBRARY_PATH="/usr/local/opt/openssl@1.1/lib"

Я переустановил драйвер ODBC с помощью этой официальной инструкции Microsoft . Но это не помогло. Я по-прежнему не могу запустить сервер django и сталкиваюсь с этой ошибкой:

  • odbc log показывает следующее:

Все ответы, которые мне удалось найти, не помогли, включая этот ответ: ODBC не может найти правильную версию OpenSSL после обновления OpenSSL

Довольно странно, что все работало в течение длительного времени, пока я не перезагрузил свой ноутбук (без обновления ОС, просто перезагрузка). Может быть эта проблема связана с экспортом некоторых переменных с путем? Пожалуйста, помогите мне решить эту проблему.

Я столкнулся с аналогичной проблемой - вы пытались проверить, есть ли на сервере какой-либо брандмауэр и внесен ли ваш ip-адрес в белый список?

У меня точно такая же ошибка при аналогичной настройке. Вы также работаете на mac M1? У меня все работало нормально, пока я не начал устанавливать вещи для работы в x86-64 Intel arch. Перешел обратно на arm64 python, но все равно не смог заставить его работать снова. Возможно, что-то недавно обновилось? jdbc у меня тоже работает нормально.

Я не уверен, смогли ли вы найти это. Но следующее решение сработало для меня. Мой odbc не мог найти ssl версии 1. Я сделал следующее: В моем /usr/local/opt/

rm openssl

или

rm openssl@3

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

Затем создайте новую ссылку, указывающую на openssl1.1

ln -s /usr/local/Cellar/openssl@1.1/1.1.1l_1 /usr/local/opt/openssl

Дайте мне знать, помогло ли вам это, чтобы мы могли найти решение.

У меня была точно такая же ошибка с аналогичной настройкой. Поскольку я работаю на макбуке M1, я обнаружил, что моя проблема была в установке Python на Intel x86-64, но драйверы msodbcsql/unixodbc работали на Arm64.

Убедитесь, что это ваша проблема, выполнив следующие команды:

% file $(which odbcinst)
% file $(which isql)  
% file $(which python3)

В результате должно получиться:

  • Мах-О 64-битный исполняемый файл x86_64, или
  • Mach-O 64-битный исполняемый файл arm64

Все должно возвращать один и тот же результат. Если один из них отличается, это ваша проблема.

Если это ваш случай, определите, в какой арке вы должны находиться, и переустановите компоненты в правильной арке.

В моем случае мне пришлось использовать Rosetta Terminal для установки brew в Intel arch (/usr/local/bin/brew) и установки всех компонентов вместе с ним.

Теперь мой pipenv запускает python в Intel и использует драйверы Intel odbc. Папки установки:

% file $(which python3)
/usr/local/bin/python3: Mach-O 64-bit executable x86_64

% file $(which isql)    
/usr/local/bin/isql: Mach-O 64-bit executable x86_64

% file $(which odbcinst) 
/usr/local/bin/odbcinst: Mach-O 64-bit executable x86_64
Вернуться на верх