首页 > 编程问答 >尝试使用 pyodbc 连接到 SQL Server 数据库时出现操作错误

尝试使用 pyodbc 连接到 SQL Server 数据库时出现操作错误

时间:2024-07-31 14:49:54浏览次数:9  
标签:python sql-server odbc pyodbc

我正在尝试使用 Python 3 中的 pyodbc 连接到 SQL Server 数据库。但是当我尝试建立连接时出现错误。

我做了这样的事情:

import pyodbc
conn = pyodbc.connect('Driver={ODBC Driver 18 for SQL Server};Server=192.168.2.250;Database=DB;UID=username;PWD=password;')

我得到了:| ||有人知道如何解决这个问题吗?该数据库不是我自己的,所以我希望有一个不需要更改任何设置的解决方案。

OperationalError: ('08001', '[08001] [Microsoft][ODBC Driver 18 for SQL Server]SSL Provider: [error:1425F102:SSL routines:ssl_choose_client_version:unsupported protocol][error:140B40C7:SSL routines:SSL_do_handshake:peer did not return a certificate] (-1) (SQLDriverConnect)')

我在 Linux 的 Windows 子系统中运行 Ubuntu。

I'm running Ubuntu within the Windows Subsystem for Linux.


该错误信息表明的 Python 客户端和 SQL Server 之间存在 SSL/TLS 握手问题。具体来说,的 SQL Server 配置为仅接受 TLS 连接,而的 Python 客户端尝试以不支持或被服务器阻止的协议版本进行连接。

可以尝试以下几种解决方案:

1. 强制使用特定版本的 TLS

pyodbc 不直接控制 TLS 版本。可以使用环境变量在系统级别对其进行设置。

对于 OpenSSL 1.0.1 及更高版本:

export SSL_PROTOCOL=TLSv1.2

对于 OpenSSL 1.1.1 及更高版本:

export SSL_PROTOCOL_TLSv1_2=on

在设置环境变量后,请尝试再次运行 Python 脚本。

注意: 使用特定版本的 TLS 可能会带来安全风险,如果服务器配置为使用更强大的协议,则不应这样做。

2. 验证 SQL Server 配置

确保的 SQL Server 实例配置为接受来自的客户端的 TLS 连接。可能需要咨询数据库管理员以获取以下信息:

  • SQL Server 是否配置为强制使用 TLS?
  • 支持哪些 TLS 版本?
  • 是否需要特定的加密套件?

3. 更新驱动程序和库

确保使用的是最新版本的 pyodbc 和 OpenSSL 库。旧版本可能不支持服务器所需的 TLS 版本或加密套件。可以使用以下命令更新它们:

pip install --upgrade pyodbc
sudo apt-get update
sudo apt-get install --reinstall libssl-dev 

4. 禁用加密(不推荐)

警告: 禁用加密将使的连接容易受到中间人攻击。仅当位于受信任的网络上并且了解相关风险时,才应将其用作 最后的手段

要禁用加密,请在连接字符串中添加 Encrypt=No 参数:

conn = pyodbc.connect('Driver={ODBC Driver 18 for SQL Server};Server=192.168.2.250;Database=DB;UID=username;PWD=password;Encrypt=No;')

再次提醒,仅当完全了解安全隐患时,才应将此方法用作最后的手段。

如果在尝试了上述步骤后仍然遇到问题,请提供有关 SQL Server 版本、操作系统版本以及在服务器或客户端上可能拥有的任何其他相关配置的更多信息,以便我可以帮助进一步解决问题。

标签:python,sql-server,odbc,pyodbc
From: 71587239

相关文章

  • 我的目标是检测车道并控制车辆保持在车道中央。使用Python
    我目前正在做一个项目,我是一个初学者。并且我需要找到一种方法来使用检测到的车道来控制我的项目车辆保持在两条线之间的中心。img1|||img2我有疑问的话题如下如何判断我的机器人车是否在车道中央?我们应该用什么方法来控制机器人的转向......
  • 【学习笔记】Matlab和python双语言的学习(主成分分析法)
    文章目录前言一、主成分分析法1.主成分分析法简介2.主成分分析法原理3.主成分分析法思想4.PCA的计算步骤二、代码实现----Matlab三、代码实现----python总结前言通过模型算法,熟练对Matlab和python的应用。学习视频链接:https://www.bilibili.com/video/BV1EK41187......
  • 如何使用python输入提示具有相同参数类型但不同返回类型的函数?
    我有一个函数,它的返回类型是tuple[bool,set[int]|str]如果第0项是True,则第1项是结果set[int],否则第1项是一个str,显示失败的原因。是这样的defcallee(para_a:int)->tuple[bool,set[int]|str]:result=set([1,2,3])if......
  • 彻底卸载Python
        前言通常我们在一些软件的使用上有碰壁,第一反应就是卸载重装。所以有小伙伴就问我Python怎么卸载才能彻底卸载干净,今天这篇文章,小编就来教大家如何彻底卸载Python 软件卸载方法1:首先,在安装python时,下载了一个可执行文件,也就是Python的安装包,我们双击它,点击uninstal......
  • 如何使用 Azure Devops API (Python) 提取特定提交的文件内容?
    这就是我想要做的:每次对我的存储库中的特定分支进行提交时,我想提取该提交中更改的所有YAML文件,对其内容进行一些修改,然后将结果作为PR推送到一个新的、独立的分支。我已经弄清楚了这里的大部分步骤,但我陷入了解析提交文件内容部分。我已经尝试过get_item_content和......
  • 在Python中,为什么这个负浮点数能够通过非负while循环测试条件?
    在Python中工作收集用户输入输入需要非负在程序的另一部分成功使用了While条件但现在不明白为什么这个捕获有效输入的测试失败了。print("Howmanygramsofxyzarerequired?")xyz_string=input()xyz=int(float(xyz_string))whilex......
  • 【Python】正色表达式 - 验证罗马数字
    一、题目Youaregivenastring,andyouhavetovalidatewhetherit'savalidRomannumeral.Ifitisvalid,printTrue.Otherwise,printFalse.TraytocreatearegularexpressionforavalidRomannumeral.InputFormatAsinglelineofinputcontainin......
  • 三种语言实现二维差分(C++/Python/Java)
    题目输入一个n行m列的整数矩阵,再输入q个操作,每个操作包含五个整数x1,y1,x2,y2,c其中(x1,y1)和(x2,y2)表示一个子矩阵的左上角坐标和右下角坐标。每个操作都要将选中的子矩阵中的每个元素的值加上c。请你将进行完所有操作后的矩阵输出。输入格式第一行包含整数n,......
  • 基于python电力安全员施工培训系统【源码+文档+PPT】
    精彩专栏推荐订阅:在下方主页......
  • 基于python电影院订票信息管理系统【源码+文档+PPT】
    精彩专栏推荐订阅:在下方主页......