如何在 Ubuntu 上配置支持 SSL 的 pymssql?

How to configure pymssql with SSL support on Ubuntu?

在 Ubuntu 上配置支持 SSL 的(现在 discontinued)pymssql 需要哪些步骤,这样我就可以连接到需要加密连接的 SQL 服务器实例(例如,Azure)?

Ubuntu 16.04 LTS

(请参阅 了解 Ubuntu 18.04 LTS。)

以下内容对我全新安装 Xubuntu 16.04 LTS x64 有效:

第一个挑战是我们从 Ubuntu 16.04 存储库获得的 FreeTDS 不支持 SSL "out of the box",因此我们需要构建自己的。首先安装 python3-pip(它还会安装 build-essentials、g++ 以及我们需要的其他一些东西)和 libssl-dev(构建支持 SSL 的 FreeTDS 所需的 OpenSSL 库)

sudo apt install python3-pip libssl-dev

通过单击 freetds.org "Stable Release" link 下载 FreeTDS 的源代码。解压存档,切换到您刚刚创建的目录(例如,freetds-1.00.104),然后执行

./configure --with-openssl=/usr/include/openssl --enable-msdblib
make
sudo make install

使用

检查构建
tsql -C

并确保 "TDS version: auto" 和 "OpenSSL: yes" 已列出。然后使用 tsql 测试 "raw" FreeTDS 连接,例如

tsql -H example.com -p 1433 -U youruserid -P yourpassword

现在安装pymssql。默认情况下,最新版本作为预编译的 "wheel" 文件提供, 不支持 加密连接,因此我们需要从 pymssql 源安装。从pymssql 2.1.4开始,构建过程依赖Cython,所以先做

pip3 install --user Cython

然后

pip3 install --user --no-binary pymssql pymssql

构建完成后,将安装 pymssql。

但是...它(还)行不通。当我们尝试在 Python 中执行 import pymssql 时,我们得到

ImportError: libsybdb.so.5: cannot open shared object file: No such file or directory

因为显然该文件位于 "wrong" 位置。解决方法(参考:here)是在 "right" 位置创建一个指向实际文件

的符号 link
sudo ln -s /usr/local/lib/libsybdb.so.5 /usr/lib/libsybdb.so.5
sudo ldconfig

现在 pymssql 使用 SSL 连接。

反正对我来说。

Ubuntu 18.04 LTS

Ubuntu18.04 存储库将安装支持 GnuTLS 的 FreeTDS 版本,因此并非绝对需要从源代码构建 FreeTDS。但是,我们仍然需要从源代码构建 pymssql,因为只需执行通常的

pip3 install --user pymssql

将安装不支持安全连接的预编译 "wheel"。相反,我们需要做

sudo apt install python3-pip freetds-dev
pip3 install --user Cython
pip3 install --user --no-binary pymssql pymssql

对于 Ubuntu 16.04,似乎至少 Docker 容器有一个已经支持 SSL 的 FreeTDS 版本。

此外,至少对于 Python 2.7,不需要 Cython:

https://github.com/tds-fdw/ci-setup/blob/master/ubuntu16.04/Dockerfile(第 23-39 行)

但有一点要记住!

连接到 Azure 的 TDS 版本必须至少为 7.1(或更高版本,具体取决于您的需要:https://www.freetds.org/userguide/choosingtdsprotocol.htm

否则你会看到臭名昭著的:

[ERROR] (20017, 'DB-Lib error message 20017, severity 9:\nUnexpected EOF from the server\nNet-Lib error during Operation now in progress (115)\nDB-Lib error message 20002, severity 9:\nAdaptive Server connection failed\n')

出于某种原因,Ubuntu 14.04 和 pymssql 2.1.3 不需要任何额外配置 (https://github.com/tds-fdw/ci-setup/blob/master/ubuntu14.04/Dockerfile)

可以通过以下任一方式完成:

export TDSVER=7.1

或者,在 Python 代码和连接函数中,添加参数:

 tds_version='7.1'

这样,我就可以使用 pymssql 2.1.4 毫无问题地连接到 Azure。

可以使用pymssql:2.2.0

首先卸载旧的pymssql:

sudo pip3 uninstall pymssql

第二次安装新的pymssql:

sudo pip3 install "pymssql==2.2.0"