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

Я пытаюсь подключить скрипт 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="my_user@myserver.database.windows.net",
    timeout=1200,
    password="XXXXXXXX",
    database="my_db",
    autocommit=True
)

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

my_user@myserver.database.windows.net

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

_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

1 Ответ

1 голос
/ 17 июня 2019

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

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

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
...