使用 pyodbc 从 WSL2 连接到 Windows 上的 SQL Server - 连接超时

Luí*_*sta 4 sql-server pyodbc wsl-2

我正在尝试从 WSL2 连接到 Windows 上的 SQL 服务器,但收到连接超时错误

我正在使用这段代码:

import pyodbc
server = 'DESKTOP-LFOSSEF'
database = 'sportsanalytics'
username = 'user'
password = '{pass}'   
driver= '{ODBC Driver 17 for SQL Server}'

with pyodbc.connect('DRIVER='+driver+';SERVER=tcp:'+server+';PORT=1433;DATABASE='+database+';UID='+username+';PWD='+ password) as conn:
    with conn.cursor() as cursor:
        cursor.execute("SELECT TOP 3 name, collation_name FROM sys.databases")
        row = cursor.fetchone()
        while row:
            print (str(row[0]) + " " + str(row[1]))
            row = cursor.fetchone()
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

回溯(最近一次调用最后一次):文件“”,第 1 行,在 pyodbc.OperationalError: ('HYT00', '[HYT00] [Microsoft][ODBC Driver 17 for SQL Server]登录超时已过期 (0) (SQLDriverConnect)' )

知道我是否需要任何额外的配置来连接到 Windows 上安装的 SQL Server 吗?

问候

Not*_*1ds 9

我想你已经很接近了。你有:

server = 'DESKTOP-LFOSSEF'
Run Code Online (Sandbox Code Playgroud)

大多数人都经历localhost过这一点。

但是DESKTOP-LFOSSEFWSL2 中的解析是否正确?我的经验是,您通常需要:

  • 主 Windows 网络适配器的 IP。暂时对其进行硬编码以消除其他问题可能很有用。
  • 如果 Windows 主机有 DNS 名称,您可以使用它。如果您当前的服务器名称无法解析,您可能需要添加域。
  • Windows 主机向 WSL2 提供的虚拟路由器的 IP(ip route show default从 WSL 内部)
  • WSL2 中 Windows 主机的 mDNS 名称,应解析为虚拟路由器的 IP。WSL2 自动分配 Windows“计算机名称”+“.local”域作为该地址的 mDNS 名称。

尝试这个:

import pyodbc,socket
server = f'{socket.gethostname()}.local'
Run Code Online (Sandbox Code Playgroud)