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

3

我正在尝试从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()

我收到了以下错误信息:

Traceback (most recent call last): File "", line 1, in pyodbc.OperationalError: ('HYT00', '[HYT00] [Microsoft][ODBC Driver 17 for SQL Server]Login timeout expired (0) (SQLDriverConnect)')

请问我需要进行额外配置才能连接安装在Windows上的SQL Server吗?

谢谢。

2个回答

8

我认为你已经接近了,但还差一点。你有:

server = 'DESKTOP-LFOSSEF'

大多数人此时会有 localhost

但是,在WSL2内部,DESKTOP-LFOSSEF是否能够正确解析? 我的经验是您通常需要以下任一选项:

  • 主Windows网络适配器的IP地址。为了消除其他问题,临时硬编码它可能很有用。
  • 如果Windows主机具有DNS名称,则可以使用该名称。 如果您当前的服务器名称未解析,则可能需要添加域。
  • 由Windows主机提供给WSL2的虚拟路由器的IP地址(在WSL内输入ip route show default)。
  • 从WSL2内部访问Windows主机的mDNS名称,应将其解析为虚拟路由器的IP地址。 WSL2自动将Windows“计算机名称”+“.local”域分配为此地址的mDNS名称。

请尝试此操作:

import pyodbc,socket
server = f'{socket.gethostname()}.local'

太好了!:) 我不知道.local就可以了,我以为只需要hostname!非常感谢你。 - undefined
太棒了,非常感谢你! - undefined

2

我已经set up了一段时间,但我非常确定你本地机器的名称,在这种情况下是DESKTOP-LFOSSEF,会映射回你的(WSL)容器,而不是主机; 因为容器也被赋予了相同的主机名。因此,您可以使用主机机器的IP地址,我非常确定它始终是172.19.208.1

我不记得在/etc/hosts中是否给主机分配了不同的名称(我已经编辑过我的),所以我建议您首先检查一下。否则,您可以添加一个指向localhost的条目,或者编辑指向带有主机名称的主机的条目(这就是我所做的)。

要进行编辑,请使用您喜欢的命令行文本编辑器编辑/etc/hosts文件(我使用nano,所以我会执行sudo nano /etc/hosts),然后编辑相关行。因此,我的看起来像这样:

# This file was automatically generated by WSL. To stop automatic generation of this file, add the following entry to /etc/wsl.conf:
# [network]
# generateHosts = false
127.0.0.1       localhost
# 127.0.1.1     Imentet.localdomain     Imentet
172.19.208.1    imentet

这里的 imentet 是我的计算机的名称。


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