Pyodbc:登录超时错误

问题描述 投票:0回答:6

我正在尝试使用

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

sql-server python-3.x ubuntu-16.04 pyodbc
6个回答
25
投票

Microsoft SQL Server 的 ODBC 驱动程序不使用

PORT=
参数。端口号(如果有)用逗号附加到服务器名称/IP 后面,例如,

SERVER=xxxTest-SRV,51333;

11
投票

我遇到了同样的问题,但我的场景是使用 PyOdbc 模块通过 AWS Lambda 函数连接到 ec2 实例上托管的 SQL 服务器。对我来说,将主机名替换为 ec2 实例的 IP 地址即可解决该问题。

我发现它无法解析dns。因此,如果上述任何步骤对您不起作用,请尝试使用 IP 地址并在此处发表评论


4
投票

在 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;")

0
投票

我的案例解决的方法是在“SQL 配置管理器”--> SQL Server 网络配置 --> XYX 协议 --> TCP/IP --> 属性 --> IP 地址 --> IPAII 中进行配置(此处在 TCP 动态端口中设置为空,在 TCP 端口处设置 1433(或您要使用的端口)

您可以了解更多详情这里


0
投票

适用于 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))

0
投票

将其放在这里,以防它可以帮助与我有类似情况的人:

对我来说,修复的是一个网络问题,该问题不允许我的 Ubuntu 计算机将 SQL Server 的名称解析为其 IP 地址。通过尝试通过主机名 ping SQL Server 后返回

Temporary failure in name resolution
发现了这一点。

如果我替换为IP,我连接成功,但最好的解决方案是在网络管理员的帮助下更正Ubuntu服务器的网络配置。据他们称,Ubuntu 服务器所属的 VLAN 上的名称服务器设置配置不正确。

© www.soinside.com 2019 - 2024. All rights reserved.