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

标签 python sql-server freetds

我有一个在 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/

相关文章:

Python - 使用 strptime() 将 "20:52:30.0000000+02:00"转换为日期时间

python - 查找位于点云凹包中的点

sql-server - SQLAlchemy 和 mssql+pymssql 密码在一定长度后失败

sql-server - 在使用 UnixODBC、FreeTDS 和 PyODBC 时遇到问题

Python虾reddit api : Reliably get posts as they are posted

python - 使用python在一定范围内生成具有高斯函数的数字

java - 当我没有执行回滚时,为什么会收到 "Cannot invoke a rollback operation when the AutoCommit mode is set to "true"."?

java - JdbcTemplate 抛出 java.sql.SQLException :

sql-server - 更改本地时钟会影响远程 SQL Server 数据库功能

sql-server - 使用 freetds 和 unixODBC 在 SQL Server 上运行带重音符号 (á,é,í,ó,ú) 的查询