我有一个在 Linux 机器上运行的 Python 应用程序,它连接到在虚拟机内的 Windows Server 中运行的 MS SQL Server 数据库。我有我的理由。我的应用程序进行一些大型查询并处理大量数据。它大部分工作正常,但有时程序会因以下原因而崩溃:
python: read.c:207: tds_get_string: Assertion `dest_size >= (size_t) string_len' failed.
我不确定从哪里开始。没有 Python 堆栈跟踪。相反,该程序只是打印上面的内容并终止。如果这是一个正常的异常,我可以捕获并处理它。
我的 sqlalchemy 连接字符串是:
mssql+pyodbc://username:password@localhost:1433/database?driver=FreeTDS
如果它很重要,tsql -C 会给出以下输出:
Compile-time settings (established with the "configure" script)
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。我一直在尝试从源代码安装各种不同版本的 freetds、unixodbc 和 pyodbc。到目前为止,我还没有找到一个完全有效的组合。但是,我真的不知道我在做什么。我正在寻找解释、想法或解决方法。或者,当然,简单而完整的解决方案。
最佳答案
我找到了一个解决方法:不要使用 freetds。事实证明,有一个适用于 Linux 的 Microsoft odbc 驱动程序。我按照说明 here安装它。我不得不升级我的内核,除此之外,让它工作。安装后,我查看了我的 odbcinst.ini 文件,发现有一个新条目“ODBC Driver 13 for SQL Server”。我更改了我的 sqlalchemy 连接字符串以匹配它:
mssql+pyodbc://username:password@localhost:1433/database?driver=ODBC+Driver+13+for+SQL+Server
现在一切似乎都正常了。微软驱动感觉比freetds慢很多(我没有实际计时过),但是我没有遇到之前的任何错误。
关于python - 通过 sqlalchemy 使用 mssql+pyodbc 从 Linux 连接到 MS SQL Server 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41715657/