_tds.InterfaceError при попытке подключиться к хранилищу данных Azure через Python 2.7 и ctds

Я пытаюсь подключить скрипт python 2.7 к хранилищу данных SQL Azure.

Часть кода завершена, и тестовые примеры работают в нашей среде разработки. Мы кодируем Python 2.7 в MacOS X и подключаемся к ADW ​​через ctds. Проблема возникает при развертывании в нашем модуле Azure Kubernetes (под управлением Debian 9). Когда мы пытаемся создать соединение таким образом:

# init a connection
self._connection = ctds.connect(
    server='myserver.database.windows.net',
    port=1433,
    user="[email protected]",
    timeout=1200,
    password="XXXXXXXX",
    database="my_db",
    autocommit=True
)

мы получаем исключение, которое выводит только имя пользователя

[email protected]

тип исключения

_tds.InterfaceError

Развернутый код такой же, как и требования.

Документация, которую мы нашли для этого исключения, практически не существует.

Вы, ребята, узнаете это? Вы знаете, как мы можем это обойти?

Мы также пробовали в наших старых экземплярах AWS EC2 и AWS Kubernetes (которые используют ту же ОС, что и Azure), и это тоже не работает.

Нам удалось подключиться к ADW ​​через sqlcmd, так что это доказывает, что модуль может действительно подключиться (я полагаю).

РЕДАКТИРОВАТЬ: РЕШЕНО. ПРОСТО ИЗМЕНИЛ НА PYODBC

def connection(self):
    """:rtype: pyodbc.Connection"""
    if self._connection is None:

        env = '' # whichever way you have to identify it
        # init a connection

        driver = '/usr/local/lib/libmsodbcsql.17.dylib' if env == 'dev' else '{ODBC Driver 17 for SQL Server}' # my dev env is MacOS and my prod is Debian 9
        connection_string = 'Driver={driver};Server=tcp:{server},{port};Database={db};Uid={user};Pwd={password};Encrypt=yes;TrustServerCertificate=no;Connection Timeout=30;'.format(
            driver=driver,
            server='myserver.database.windows.net',
            port=1433,
            db='mydb',
            user='myuser@myserver',
            password='XXXXXXXXXXXX'
        )
        self._connection = pyodbc.connect(connection_string, autocommit=True)

    return self._connection

person Alex Ingberg    schedule 17.06.2019    source источник
comment
Microsoft поддерживает / рекомендует pyodbc, и похоже, что вы используете одну из альтернатив TDS. Кроме того, это необычная форма идентификатора пользователя: если вы используете аутентификацию SQL, вам потребуется только строка перед @.   -  person Ron Dunn    schedule 17.06.2019
comment
Да, пользователь выглядит странно .... но я клянусь, что так оно и работает (по крайней мере, локально). Если я просто введу имя пользователя без @part, этого не произойдет.   -  person Alex Ingberg    schedule 17.06.2019
comment
Есть ли веская причина использовать ctds вместо pyodbc? Когда я раньше тестировал альтернативные библиотеки, я всегда обнаруживал подводные камни. Вот почему я предпочитаю, чтобы клиенты использовали поддерживаемый вариант. В этом случае я попытался выполнить PIP копию ctds и протестировать ее, но для этого требуется установка компилятора и т. Д., И у меня не будет на это времени до завтра.   -  person Ron Dunn    schedule 17.06.2019
comment
Не совсем, за исключением того факта, что мы уже использовали ctds в другом соединении, поэтому это означало меньше времени. Pyodbc теперь требует, чтобы я установил драйверы и перенастроил все, чтобы он работал ... и, учитывая, что у меня уже настроен и работает мой локальный env, я думаю, что должно быть проще просто исправить prod для работы с ctds   -  person Alex Ingberg    schedule 17.06.2019
comment
Зарегистрируйтесь здесь Подключение к базе данных SQL Azure с примечанием: ВАЖНО: Не используйте [email protected] в качестве параметра пользователя.   -  person Mark    schedule 17.06.2019
comment
Ребята, у вас все в порядке. Изменился на pyodbc, установил драйвер, и после пары часов работы теперь у меня все работает. Всего пара вещей. Если вы используете Debian, как и я, часть Driver = в строке подключения работала как «{ODBC Driver 17 для SQL Server}», а в моей среде разработки (MacOS) - как «/usr/local/lib/libmsodbcsql.17. Дилиб. Решил это с помощью sth, например, this driver = '/usr/local/lib/libmsodbcsql.17.dylib' if env == 'dev' else '{Драйвер ODBC 17 для SQL Server}'   -  person Alex Ingberg    schedule 18.06.2019


Ответы (1)


Как говорит Рон, рекомендуется использовать pyodbc, потому что он позволяет использовать поддерживаемый Microsoft Драйвер ODBC.

Я собираюсь предположить, что ctds не работает при перенаправлении, и вам нужно принудительно перевести ваш сервер в режим «прокси». См .: Архитектура подключения Azure SQL

EG

# Get SQL Server ID
sqlserverid=$(az sql server show -n sql-server-name -g sql-server-group --query 'id' -o tsv)

# Set URI
id="$sqlserverid/connectionPolicies/Default"

# Get current connection policy
az resource show --ids $id

# Update connection policy
az resource update --ids $id --set properties.connectionType=Proxy
person David Browne - Microsoft    schedule 17.06.2019