通过sqlalchemy使用mssql+pydbc从Linux连接到MS SQL Server时出错



我有一个Python应用程序,它在Linux机器上运行,并连接到虚拟机内Windows服务器中运行的MS SQL Server数据库。我有自己的理由。我的应用程序进行一些大型查询并处理大量数据。它通常工作得很好,但偶尔程序会崩溃,出现以下情况:

python:read.c:207:tds_get_string:Assertion`destrongize>=(大小_t)string_len'失败。

我不知道从哪里开始。没有Python堆栈跟踪。相反,程序只是打印上面的内容并终止。如果这是一个正常的例外,我可以抓住它并处理它

我的sqlalchemy连接字符串是:

mssql+pyodbc://username:password@localhost:1433/数据库?driver=FreeTDS

如果这很重要,tsql-C会给出以下输出:

编译时间设置(使用"配置"脚本建立)

Version: freetds v0.91
freetds.conf directory: /etc/freetds
MS db-lib source compatibility: no
Sybase binary compatibility: yes
Thread safety: yes
iconv library: yes
TDS version: 4.2
iODBC: no
unixodbc: yes
SSPI "trusted" logins: no
Kerberos: yes

我的猜测是我的问题是freetds中的一个错误造成的。我通过apt-get在我的Linux Mint机器上安装了freetds和unixodbc。我通过pip安装了pyodbc,我使用的是anaconda。我一直在尝试从源代码安装各种不同版本的freetd、unixodbc和pyodbc。到目前为止,我还没有找到一个有效的组合。然而,我真的不知道自己在做什么。我在寻找解释、想法或变通办法。或者,当然,简单而完整的解决方案。

我找到了一个解决方法:不要使用freetd。事实证明,有一个适用于linux的microsoftodbc驱动程序。我按照这里的说明安装了它。为了让它正常工作,我必须升级我的内核。安装后,我查看了odbcinst.ini文件,发现有一个新条目,"ODBC Driver 13 for SQL Server"。我更改了sqlalchemy连接字符串以匹配它:

mssql+pyodbc://username:password@localhost:1433/数据库?driver=ODBC+driver+13+for+SQL+Server

现在一切似乎都在工作。微软驱动程序感觉比freetds慢得多(我还没有真正计时),但我没有遇到以前的任何错误。

最新更新