使用pyodbc从Linux连接到命名实例的SQL Server

9
我目前正在尝试使用PyODBC连接到一个SQL Server(我没有可见性,但有凭据)。这段代码在我的Windows桌面上可以运行,但在我移动到RedHat Linux机器上时无法运行。我需要在Linux上支持项目。
以下是我的代码:
server = 'tcp:myserver\inst1'
database = 'mydatabase'
username = 'myusername'
password = 'mypassword'

cnxn = pyodbc.connect('DRIVER={ODBC Driver 13 for SQL Server};SERVER=' + server + ';DATABASE=' + database + ';UID=' + username + ';PWD=' + password)

这里是我遇到的错误信息:
pyodbc.OperationalError: ('HYT00', u'[HYT00] [unixODBC][Microsoft][ODBC Driver 13 for SQL Server]Login timeout expired (0) (SQLDriverConnect)')

Windows版本和Linux版本的唯一区别在于驱动程序部分。Windows使用 '{SQL Server}',而Linux版本使用 '{ODBC Driver 13 for SQL Server}'。

在我的/etc/odbcinst.ini文件中,我有以下信息:

[ODBC Driver 13 for SQL Server]
Description=Microsoft ODBC Driver 13 for SQL Server
Driver=/opt/microsoft/msodbcsql/lib64/libmsodbcsql-13.1.so.9.1
UsageCount=1

有人有什么建议吗?

该内容与IT技术无关。

你是否按照这里的安装ODBC驱动程序的说明进行了操作?(https://learn.microsoft.com/en-us/sql/connect/odbc/linux-mac/installing-the-microsoft-odbc-driver-for-sql-server#microsoft-odbc-driver-13-for-sql-server) - Phonolog
你尝试过使用机器的FQDN作为服务器名称吗? - FlipperPA
请确保您的连接字符串正确。另外,请尝试检查 SQL 服务器的防火墙,以确定您是否能够从 Linux 机器访问它。 - deathstroke
当我错误地提供端口时,出现了这个错误。端口应该与服务器用逗号分隔,例如 tcp:myserver\inst1,12345 - Will Keeling
3个回答

1

与 Microsoft SQL Server 的 Windows 版本的 ODBC 驱动程序不同,Linux 版本的驱动程序无法解析 SQL Server 实例名称。因此,在 Windows 客户端上,我们可以使用以下方法(前提是 SQL Browser 服务在服务器上运行)

cnxn = pyodbc.connect(
    "Driver=ODBC Driver 17 for SQL Server;"
    r"Server=myserver\SQLEXPRESS;"
    # and so on
)

但这在Linux上行不通。然而,我们可以使用sqlserverport模块(由我维护)从SQL Browser服务中检索端口号:

import pyodbc
import sqlserverport

servername = "myserver"
serverspec = f"{servername},{sqlserverport.lookup(servername, 'SQLEXPRESS')}"
conn = pyodbc.connect(
    "Driver=ODBC Driver 17 for SQL Server;"
    f"Server={serverspec};"
    # and so on

-1

使用IP地址端口号代替名称/实例名称。 执行此查询以获取真实的端口号:

SELECT DISTINCT local_net_address, local_tcp_port FROM sys.dm_exec_connections

然后 datasrc=N'192.168.1.112,61423'


-1

使用驱动程序路径而不是驱动程序名称。在您的示例中,使用完整的/opt/microsoft/msodbcsql/lib64/libmsodbcsql-13.1.so.9.1


如果unixODBC已正确配置(使用odbcinst.ini文件中的有效条目),则这不是必需的。这也意味着,如果您升级到同一驱动程序的新版本,则必须编辑所有应用程序中的连接字符串。 - Gord Thompson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接