2

pymssql在 linux 上运行包(版本 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,并且正在pymssql通过 buildout 安装。我也尝试过使用全局安装pip,并且我也尝试过使用最新的开发版本pymssql

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

更新:

进一步调查显示我们使用的是freetds0.91,这似乎会导致pymssql1.0.2 出现问题,但是在使用最新版本的pymssql.

4

2 回答 2

3

这是 freetds 0.91 和 pymssql 1.0.X 之间的一些不兼容问题(请参阅此处的错误报告)

然而,最新版本的 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)

于 2014-05-28T08:13:45.027 回答
0

你可以使用这个补丁:

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

于 2013-12-16T07:51:14.780 回答