我正在尝试使用
pyodbc
从运行 Ubuntu 16.04 的远程计算机连接到 MS SQL Server。
import pyodbc
conn = pyodbc.connect(r'DRIVER=ODBC Driver 17 for SQL Server; SERVER=xxxTest-SRV; PORT=51333; DATABASE=TestDB; UID=xxxx; PWD=xxxx;')
我收到以下错误:
pyodbc.OperationalError: ('HYT00', '[HYT00] [unixODBC][Microsoft][ODBC SQL Server 驱动程序 17]登录超时已过期 (0) (SQLDriverConnect)')
我尝试在连接字符串中使用服务器
IP
,但仍然没有成功。
但是,我可以从终端使用
sqlcmd
进行连接sqlcmd -S xxxTest-SRV, 51333 -d TestDB -U xxxx -P xxxx
我没有找到任何可以解决我的问题的问题。
odbcinst.ini
[ODBC Driver 17 for SQL Server]
Description=Microsoft ODBC Driver 17 for SQL Server
Driver=/opt/microsoft/msodbcsql/lib64/libmsodbcsql-17.1.so.1.1
UsageCount=1
在 Linux 计算机上使用
pyodbc
连接到 MS SQL Server 似乎总是存在问题。有没有办法从 Python 连接到 SQL Server。我将感谢您帮助解决此错误。谢谢。
[更新]
根据下面的答案,我更新了连接字符串。但是,现在我收到以下错误:
pyodbc.Error: ('01000', "[01000] [unixODBC][驱动程序管理器]无法打开 lib '/opt/microsoft/msodbcsql17/lib64/libmsodbcsql-17.0.so.1.1':文件 未找到 (0) (SQLDriverConnect)")
我的odbcinst.ini文件驱动程序定义:
[ODBC Driver 17 for SQL Server]
Description=Microsoft ODBC Driver 17 for SQL Server
Driver=/opt/microsoft/msodbcsql17/lib64/libmsodbcsql-17.0.so.1.1
UsageCount=1
从 Linux 计算机连接到 MS SQL Server 一直是一场噩梦。您能告诉一下
pyodbc
、unixODBC
和 Driver
哪个版本最稳定吗?
我已按照 this Microsoft 说明安装了驱动程序。我的
pyodbc
版本是4.0.23
Microsoft SQL Server 的 ODBC 驱动程序不使用
PORT=
参数。端口号(如果有)用逗号附加到服务器名称/IP 后面,例如,
SERVER=xxxTest-SRV,51333;
我遇到了同样的问题,但我的场景是使用 PyOdbc 模块通过 AWS Lambda 函数连接到 ec2 实例上托管的 SQL 服务器。对我来说,将主机名替换为 ec2 实例的 IP 地址即可解决该问题。
我发现它无法解析dns。因此,如果上述任何步骤对您不起作用,请尝试使用 IP 地址并在此处发表评论
在 VS Code 开发容器中使用 SQL Server docker 容器时,我遇到了同样的问题。查找 SQL Server 容器的 IP(归功于 freecodecamp.org 如何获取 docker 容器 IP 地址)并将服务器名称替换为 IP 解决了问题
conn = pyodbc.connect(
"DRIVER={ODBC Driver 17 for SQL Server};" + "SERVER=172.xx.x.x;"
"DATABASE=xxx;"
"UID=sa;"
"PWD=xxx;")
我的案例解决的方法是在“SQL 配置管理器”--> SQL Server 网络配置 --> XYX 协议 --> TCP/IP --> 属性 --> IP 地址 --> IPAII 中进行配置(此处在 TCP 动态端口中设置为空,在 TCP 端口处设置 1433(或您要使用的端口)
您可以了解更多详情这里
适用于 Linux 的 Microsoft ODBC 驱动程序无法解析实例名称,因此这在 Linux 客户端上不起作用:
Server = mydbserver.mycompany.com\SQLEXPRESS
如果您需要连接到命名实例,您可以使用(免费)sqlserverport(https://github.com/gordthompson/sqlserverport)模块。
import pyodbc
import sqlserverport
servername = 'myserver'
serverspec = '{0},{1}'.format(
servername,
sqlserverport.lookup(servername, 'SQLEXPRESS'))
conn = pyodbc.connect('DRIVER=ODBC Driver 17 for SQL Server;SERVER={};...'.format(serverspec))
将其放在这里,以防它可以帮助与我有类似情况的人:
对我来说,修复的是一个网络问题,该问题不允许我的 Ubuntu 计算机将 SQL Server 的名称解析为其 IP 地址。通过尝试通过主机名 ping SQL Server 后返回
Temporary failure in name resolution
发现了这一点。
如果我替换为IP,我连接成功,但最好的解决方案是在网络管理员的帮助下更正Ubuntu服务器的网络配置。据他们称,Ubuntu 服务器所属的 VLAN 上的名称服务器设置配置不正确。