pymssql(python模块)无法使用临时表

时间:2012-01-09 23:44:41

标签: python pymssql

这不是一个问题,而是一个先发制人的答案。 (我从这个网站得到了很多帮助,并想要回馈。)

当我尝试使用pymssql通过python运行它时,我正在努力处理大量的SQL查询,但直接通过MS SQL运行时会运行正常。 (例如,就我而言,我使用MS SQL Server Management Studio在python之外运行它。)

然后我终于发现了问题:pymssql无法处理临时表。至少不是我的版本,仍然是1.0.1。

作为证据,这里是我的代码片段,略有改动以保护任何IP问题:

conn = pymssql.connect(host=sqlServer, user=sqlID, password=sqlPwd, \
                       database=sqlDB)
cur = conn.cursor()
cur.execute(testQuery)

以上代码FAILS(如果我使用pymssql.OperationalError: No data available.调用它,则返回没有数据,具体而言,如果您致电cur.fetchone()则会发出错误“testQuery”):

testQuery = """
CREATE TABLE #TEST (
[sample_id] varchar (256)
,[blah] varchar (256) )
INSERT INTO #TEST
SELECT DISTINCT
        [sample_id]
        ,[blah]
FROM [myTableOI]
WHERE [Shipment Type] in ('test')

SELECT * FROM #TEST
"""

但是,如果testQuery定义如下,它可以正常工作。

testQuery = """
SELECT DISTINCT
        [sample_id]
        ,[blah]
FROM [myTableOI]
WHERE [Shipment Type] in ('test')

"""

我在Stack Overflow中进行了Google搜索以及搜索,但无法找到有关特定问题的任何信息。我还查看了在http://code.google.com/p/pymssql/wiki/FAQ找到的pymssql文档和FAQ,并没有看到任何提及不允许临时表的内容。所以我想我会加上这个“问题”。

2 个答案:

答案 0 :(得分:2)

更新:2016年7月

之前接受的答案已不再有效。第二个"将不起作用"示例确实可以在Python 2.7.11下使用pymssql 2.1.1(一次conn.autocommit(1)替换为conn.autocommit(True)以避免" TypeError:无法将int转换为bool")。

答案 1 :(得分:1)

对于那些遇到这个问题但可能有类似问题的人,我想我会传递自原帖以来我学到的东西。事实证明,您可以在pymssql中使用临时表,但是您必须非常小心处理提交。

我首先通过例子解释。以下代码将起作用:

testQuery = """
CREATE TABLE #TEST (
[name] varchar(256)
,[age] int )

INSERT INTO #TEST
values ('Mike', 12)
,('someone else', 904)

"""

conn = pymssql.connect(host=sqlServer, user=sqlID, password=sqlPwd, \
    database=sqlDB) ## obviously setting up proper variables here...
conn.autocommit(1)
cur = conn.cursor()
cur.execute(testQuery)
cur.execute("SELECT * FROM #TEST")
tmp = cur.fetchone()
tmp

然后返回第一个项目(后续提取将返回另一个项目):

('Mike', 12)

但以下内容不起作用

testQuery = """
CREATE TABLE #TEST (
[name] varchar(256)
,[age] int )

INSERT INTO #TEST
values ('Mike', 12)
,('someone else', 904)

SELECT * FROM #TEST

"""

conn = pymssql.connect(host=sqlServer, user=sqlID, password=sqlPwd, \
    database=sqlDB) ## obviously setting up proper variables here...
conn.autocommit(1)
cur = conn.cursor()
cur.execute(testQuery)
tmp = cur.fetchone()
tmp

这将失败说“pymssql.OperationalError: No data available.”我最明白的原因是,无论您是否自动提交,以及您是否专门自行提交,都必须明确创建所有表在尝试阅读之前提交并承诺。

在第一种情况下,您会注意到有两个“cur.execute(...)”来电。第一个创建临时表。完成“cur.execute()”后,自启用自动提交后,将提交SQL脚本,生成临时表。然后调用另一个cur.execute()来从该表中读取。在第二种情况下,我试图创建&从表中“同时”读取(至少在pymssql的脑海中...它在MS SQL Server Management Studio中正常工作)。由于该表先前未制作过&承诺,我无法查询。

哇...发现这很麻烦,调整我的代码(最初在MS SQL Server Management Studio上开发)将会很麻烦,以便它可以在脚本中运行。哦,好吧......