pymssql 不返回结果数据

Posted

技术标签:

【中文标题】pymssql 不返回结果数据【英文标题】:pymssql not returning result data 【发布时间】:2013-09-12 09:20:29 【问题描述】:

我在 Linux 上运行 pymssql 包(版本 1.0.2)时遇到问题。看起来我可以成功连接并向服务器发出 SQL 语句,但查询返回空白结果。我已经确认CREATE TABLEINSERT 语句可以正常工作,但即使我创建一个新表并将数据插入其中,针对该表的查询也会返回空白/空结果。这是我正在使用的代码:

>>> import pymssql
>>> conn = pymssql.connect(host='#', user='#', password='#', database='#')
>>> cur = conn.cursor()
>>> cur.execute('SELECT * FROM tblFoo')
>>> print cur.fetchone()
None
>>> cur.execute('SELECT * FROM tblFoo')
>>> cur.fetchall()
[]
>>> cur.execute('SELECT GETDATE()')
>>> print cur.fetchone()
None

我也尝试过使用_mssql 包,并使_mssql 使用全局配置通过freetds 连接到数据库,但我遇到了同样的问题。

通过tds 命令行工具进行连接和查询确实按预期返回结果。

我在 redhat 上使用 Python 2.6.6,并通过 buildout 安装 pymssql。我还尝试使用pip 进行全局安装,并且我还尝试使用pymssql 的最新开发版本。

有没有其他人遇到过这个或类似的问题?有关如何调试此问题的任何建议?我被限制在这个项目中使用 SQL Server,我无法使用pyodbc

更新:

进一步调查显示我们正在使用freetds 0.91,这似乎会导致pymssql 1.0.2 出现问题,但是我在使用最新版本的pymssql 构建时仍然遇到问题。

【问题讨论】:

你能添加一些代码吗?如何知道你得到了空白结果? @RomanPekar 我不确定这是否值得,但我会用更多信息更新问题。 感谢提问,pmod 的回答解决了我的问题 :) 【参考方案1】:

这是 freetds 0.91 和 pymssql 1.0.X 之间的一些不兼容问题(请参阅 bugreport here)

但是,最新版本的 pymssql 解决了这个问题(我升级到 2.0.1,这个问题就消失了 - 包的确切名称:pymssql-2.1.0-py2.7-linux-x86_64.egg)。使用 python setuptools 现在很容易:

easy_install --upgrade pymssql

(别忘了python-dev和freetds-dev debs应该事先安装好)

【讨论】:

【参考方案2】:

你可以使用这个补丁:

diff --git a/mssqldbmodule.c b/mssqldbmodule.c
index 151bc2c..7081715 100644
--- a/mssqldbmodule.c
+++ b/mssqldbmodule.c
@@ -1934,12 +1934,12 @@ PyObject *get_result(_mssql_connection *conn) 

  // find a result set that has at least one column
conn->last_dbresults = SUCCEED;
-   while (conn->last_dbresults == SUCCEED &&
-           (conn->num_columns = dbnumcols(conn->dbproc)) <= 0) 
+   do 
        Py_BEGIN_ALLOW_THREADS
        conn->last_dbresults = dbresults(conn->dbproc);
        Py_END_ALLOW_THREADS
-   
+    while (conn->last_dbresults == SUCCEED &&
+           (conn->num_columns = dbnumcols(conn->dbproc)) <= 0);

    check_cancel_and_raise(conn->last_dbresults, conn);

http://lists.ibiblio.org/pipermail/freetds/2013q3/028493.html

https://gist.github.com/msabramo/6501240

【讨论】:

以上是关于pymssql 不返回结果数据的主要内容,如果未能解决你的问题,请参考以下文章

通过 pymssql 将 int 变量与 MSSQL 查询结果 Python 进行比较

Python pymssql 尝试启动新的 Adaptive Server 操作,但结果未决

pymssql 在 Azure/Windows 上返回的字符集与在 Mac 上不同

为啥查询的数据在结果集中返回而不是在数组中?

从存储过程pymssql获取返回值

核心数据获取请求不返回不同的结果