Подключение к SQL Server выдает pyodbc.InterfaceError - PullRequest
3 голосов
/ 12 апреля 2019

Я пытаюсь подключиться к базе данных MS-SQL в облаке Azure из кода Python, как показано ниже.

import pyodbc 
connect_str = "Driver={ODBC Driver 17 for SQL Server};" + \
    "Server={server},1433;".format(server='tcp:ipaddress.database.windows.net') + \
    "Database={database};".format(database='mydb') + \
    "uid={uid};".format(uid='myuserid') + \
    "pwd={pwd};".format(pwd='secretpswd') + \
    "Encrypt=yes;TrustServerCertificate=no;"
cnxn = pyodbc.connect(connect_str)

Я получаю ошибку:

pyodbc.InterfaceError: ('28000', "[28000] [Microsoft] [Драйвер ODBC 17 для SQL Server] [SQL Server] Ошибка входа для пользователя «myuserid». (18456) (SQLDriverConnect) ")

Я попытался удалить номер порта из определения сервера в строке подключения. Также я попробовал без опции Encrypt и TrustServerCertificate. Все время выдает одну и ту же ошибку.

Я пытался соединиться с теми же учетными данными, используя Management Studio, и это сработало.

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

1 Ответ

1 голос
/ 12 апреля 2019

Хорошо, так что мне удалось выяснить, в чем дело.

Мой пароль содержал некоторые значения, которые не были экранированы должным образом.

Во-первых, если значение параметра строки подключения содержит ';' его следует избегать с помощью фигурных скобок.

Так что мне нужно было заменить:

"pwd={pwd};".format(pwd='secretpswd') -строка pwd=secretpswd с

"pwd={{{pwd}}};".format(pwd='secretpswd') - строка pwd={secretpswd}

Также, если пароль содержит фигурные скобки, он должен удвоить его. Это можно сделать как

pwd = 'password_with_curly_braces_{}'
pwd = pwd.replace('}', '}}').replace('{', '{{')
...