从sql server到带有pyodbc的pandas数据框-在处理小型表时,它会在复杂的sql查询中出现错误

时间:2019-05-22 13:55:37

标签: python sql-server pyodbc

1 step: Create a temporary table with pyodbc into sql server for objects
2 step: Select objects from temporary table and load it into pandas dataframe
3 step: print dataframe

用于创建临时表,我使用pyodbc游标,因为它使用pandas.read_sql命令解决了错误。如果我尝试将光标转换为pandas数据框,则会引发错误。甚至有用于将元组处理成数据帧的特殊行。

我的程序可以连接,创建,读取和打印,只要查询保持简单即可。 (我的实际方法有几百行sql查询语句)

import codecs
import os
import io
import pandas as pd
import pyodbc as po

server = 'sql_server'
database = 'sql_database'

connection = po.connect('DRIVER={SQL Server};SERVER='+server+';DATABASE='+database+';Trusted_Connection=yes;')
cursor = connection.cursor()

query1 = """
CREATE TABLE #ttobject (object_nr varchar(6), change_date datetime)
INSERT INTO #ttobject (object_nr)
VALUES
('112211'),
('113311'),
('114411');
"""

query2 = """
SELECT *
FROM #ttobject

Drop table if exists #ttobject
"""


cursor.execute(query1)
df = pd.read_sql_query(query2, connection)
print(df)

由于实际查询的长度,我为您省去了麻烦,而是在此处发布错误代码:

('HY000', '[HY000] [Microsoft][ODBC SQL Server Driver]Connection is busy with results for another hstmt (0) (SQLExecDirectW)')

此错误在query2处引发,它是具有某些联接和数据透视功能的多选择语句

当我尝试将所有内容放入一个游标时,我遇到了将其从游标转换为DataFrame的问题(尝试了几种方法,也许有人知道一个不在SO上或具有特殊标题的方法,所以我无法找到它)

如果我仅尝试使用pd.read_sql,则同样的问题,则临时表的创建不起作用

我不知道从这里继续前进。

请让我知道我是否可以为您提供进一步的详细信息,根据我的失落情况,我可能会对其进行过多监视:S

23.5.19进一步调查:

  • 根据Gord,我尝试将autocommit添加为true,这将起作用 对于简单的sql语句,但不是很长时间, 费时的。
  • 第二次,我尝试添加

    “ cursor.execute('SET NOCOUNT ON; EXEC schema.proc @muted = 1')

  • 目前,我猜第一个查询需要更长的时间,因此python已经从第二个查询开始,因此连接是 受阻。或者第一个查询正在重现一些反馈,所以python 认为它在实际完成之前就完成了。

  • 在执行第一个查询后添加了time.sleep(100),但仍然得到hstmt is busy错误。想知道为什么会这样,因为它应该有足够的时间来处理第一个
  • 事实:只要我不尝试从中输出任何结果,查询就可以顺利运行

0 个答案:

没有答案