连接到SQL Server会引发pyodbc.InterfaceError

时间:2019-04-12 11:51:46

标签: python sql-server pyodbc

我尝试通过类似波纹管的Python代码连接到Azure云上的MS-SQL数据库。

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   for SQL Server] [SQL Server]用户“ myuserid”的登录失败。 (18456)   (SQLDriverConnect)“)

我尝试从连接字符串中的服务器定义中删除端口号。我也尝试了不带选项Encrypt和TrustServerCertificate。一直显示相同的错误。

我尝试使用Management Studio使用相同的凭据进行连接,并且有效。

您能指定我在做什么错吗?

1 个答案:

答案 0 :(得分:1)

好的,所以我设法找出问题所在。

我的密码包含一些无法正确转义的值。

首先,如果连接字符串选项的值包含“;”应该用大括号将其转义。

所以我需要替换:

"pwd={pwd};".format(pwd='secretpswd')-字符串pwd=secretpswd

"pwd={{{pwd}}};".format(pwd='secretpswd')-字符串pwd={secretpswd}

此外,如果密码包含大括号,则应该将其括起来。可以像

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