pymssql(python模块)无法使用临时表
这不是一个问题,而是一个先发制人的答案。(我从这个网站得到了很多帮助,我想回馈。) 当我尝试使用pymssql通过python运行SQL查询时,遇到了一个很大的SQL查询失败,但是直接通过mssql运行会很好。(例如,在我的例子中,我使用MS SQL Server Management Studio在python之外运行它。) 然后我终于发现了问题:pymssql无法处理临时表。至少不是我的版本,它仍然是1.0.1 作为证明,以下是我的代码片段,稍作修改以保护任何IP问题:pymssql(python模块)无法使用临时表,python,pymssql,Python,Pymssql,这不是一个问题,而是一个先发制人的答案。(我从这个网站得到了很多帮助,我想回馈。) 当我尝试使用pymssql通过python运行SQL查询时,遇到了一个很大的SQL查询失败,但是直接通过mssql运行会很好。(例如,在我的例子中,我使用MS SQL Server Management Studio在python之外运行它。) 然后我终于发现了问题:pymssql无法处理临时表。至少不是我的版本,它仍然是1.0.1 作为证明,以下是我的代码片段,稍作修改以保护任何IP问题: conn = pym
conn = pymssql.connect(host=sqlServer, user=sqlID, password=sqlPwd, \
database=sqlDB)
cur = conn.cursor()
cur.execute(testQuery)
如果调用cur.fetchone()
),则上述代码失败(具体而言,不返回任何数据,并抛出错误“pymssql.OperationalError:无可用数据。
”,如果我使用定义如下的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')
"""
我做了谷歌搜索和堆栈溢出搜索,但找不到关于特定问题的任何信息。我还查看了pymssql文档和常见问题,可在
http://code.google.com/p/pymssql/wiki/FAQ
,没有看到任何提到不允许使用临时表的内容。所以我想我应该加上这个“问题”。对于那些遇到这个问题并且可能有类似问题的人,我想我应该把我从最初的帖子中学到的东西传递给他们。事实证明,您可以在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
然后将返回第一个项目(后续提取将返回另一个项目):
但以下方法行不通
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:没有可用的数据,
”这将失败。我能说的最好的原因是,无论您是否启用了自动提交,无论您是否明确自己进行了提交,在尝试从表中读取之前,都必须显式地创建和提交所有表
在第一种情况下,您会注意到有两个“cur.execute(…)
”调用。第一个创建临时表。在完成“cur.execute()
”后,由于自动提交已打开,SQL脚本已提交,因此创建临时表。然后调用另一个cur.execute()
从该表中读取。在第二种情况下,我尝试“同时”创建和读取表(至少在pymssql
的头脑中是这样的……它在mssqlservermanagementstudio中工作得很好)。由于该表之前尚未生成和提交,因此我无法查询它
哇。。。这是一个很难发现的问题,调整我的代码(最初是在MSSQLServerManagementStudio上开发的)以使其在脚本中工作也是一个难题。哦,好吧…对于那些遇到这个问题并可能有类似问题的人,我想我应该把从最初的帖子中学到的东西传递给他们。事实证明,您可以在
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
然后将返回第一个项目(后续提取将返回另一个项目):
但以下方法行不通
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:没有可用的数据,
”这将失败。我能说的最好的原因是,无论您是否启用了自动提交,无论您是否明确自己进行了提交,在尝试从表中读取之前,都必须显式地创建和提交所有表
在第一种情况下,您会注意到有两个“cur.execute(…)
”调用。第一个创建临时表。在完成“cur.execute()
”后,由于自动提交已打开,SQL脚本已提交,因此创建临时表。然后调用另一个cur.execute()
从该表中读取。在第二种情况下,我尝试“同时”创建和读取表(至少在pymssql
的头脑中是这样的……它在mssqlservermanagementstudio中工作得很好)。由于该表之前尚未生成和提交,因此我无法查询它
哇。。。这是一个很难发现的问题,调整我的代码(最初是在MSSQLServerManagementStudio上开发的)以使其在脚本中工作也是一个难题。哦……更新:2016年7月
以前接受的答案不再有效。第二个“将不起作用”示例确实适用于Python 2.7.11下的pymssql 2.1.1(一旦conn.autocommit(1)
替换为conn.autocommit(True)
,以避免“类型错误:无法将int转换为bool”) 更新日期:2016年7月
以前接受的答案不再有效。第二个“将不起作用”示例确实适用于Python 2.7.11下的pymssql 2.1.1(一旦
conn.autocommit(1)
替换为conn.autocommit(True)
,以避免“类型错误:无法将int转换为bool”) 您好@gord thompson,谢谢您的更新!我会留下我的旧答案,简单的b/c它有更多的细节,但我现在已经接受了你的正式答案。嗨@gord thompson,谢谢你的更新!我会留下我的旧答案,简单的b/c,它有更多的细节,但我现在已经接受你的正式答案。