开发者社区 问答 正文

在Ubuntu VM中运行python代码时出现pyodbc.OperationalError

我已经在Spyder中运行了我的代码,但没有收到错误。当我在Ubuntu VM中运行相同的python3代码时,收到以下错误:Traceback (most recent call last): File "Script - Full.py", line 40, in conn = pyodbc.connect('DRIVER='+driver+';SERVER='+server+';DATABASE='+database+';Trusted_Connection='+trusted) pyodbc.OperationalError: ('HYT00', '[HYT00] [Microsoft][ODBC Driver 17 for SQL Server]Login timeout expired (0) (SQLDriverConnect)') 该错误所指的当前代码是:

server = 'SERVER_NAME'
database = 'DATABASE_NAME'
trusted = 'yes'
driver= '{ODBC Driver 17 for SQL Server}'
conn = pyodbc.connect('DRIVER='+driver+';SERVER='+server+';DATABASE='+database+';Trusted_Connection='+trusted)

我只是在尝试连接数据库并读取其中的值的地方

当我使用Windows身份验证时,在我的本地PC上运行,但是当我在VM中运行此代码时,会出现上述错误?

展开
收起
心有灵_夕 2019-11-30 21:14:15 1306 分享 版权
阿里云 AI 助理回答

这个错误信息表明你的Python脚本在尝试通过ODBC连接到SQL Server时遇到了登录超时的问题。这通常意味着你的VM中的Python环境在尝试与数据库服务器建立连接时,由于某种原因无法及时完成身份验证过程。以下是一些可能的解决方案和排查步骤:

  1. 网络问题:首先检查你的Ubuntu VM是否能够访问到SQL Server所在的网络。可以尝试ping SQL Server的IP地址来测试网络连通性。

  2. 驱动程序问题:确认ODBC Driver 17 for SQL Server是否已正确安装在你的Ubuntu VM上,并且版本兼容。你可以通过运行odbcinst -j命令来查看已安装的ODBC驱动程序。

  3. 防火墙/安全组设置:确保SQL Server的防火墙或云服务(如果适用)的安全组规则允许来自你的VM IP的连接。特别是当使用Azure SQL Database或AWS RDS等云托管数据库时,需要正确配置安全组规则。

  4. 连接字符串格式:你的连接字符串格式似乎有误,应该用正确的字符串插值或拼接方式。修改代码如下:

    conn_str = f'DRIVER={{{driver}}};SERVER={server};DATABASE={database};Trusted_Connection={trusted}'
    conn = pyodbc.connect(conn_str)
    

    注意使用了f-string来构造字符串,并且在{}内对driver变量进行了正确的转义。

  5. 身份验证方式:你提到在本地使用Windows身份验证成功,但在VM中失败。这可能是因为VM不支持或未配置Windows身份验证。考虑改为使用SQL Server认证,即提供用户名和密码。修改连接字符串为:

    user = 'your_username'
    password = 'your_password'
    conn_str = f'DRIVER={{{driver}}};SERVER={server};DATABASE={database};UID={user};PWD={password}'
    conn = pyodbc.connect(conn_str)
    
  6. 端口开放:确保SQL Server正在监听的TCP端口(默认是1433)没有被阻止,并且在连接字符串中指定端口(如果非默认)。

  7. SQL Server配置:检查SQL Server的远程连接是否启用,以及是否允许来自你VM的IP地址的连接。

逐一排查上述点,应该能帮助你定位并解决连接超时的问题。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答