DatabaseError:(' HY000',' [HY000] [Microsoft] [ODBC SQL Server驱动程序]连接忙于另一个hstmt(0)(SQLExecDirectW)')的结果

时间:2017-11-17 16:27:07

标签: python sql-server pandas pyodbc

我正在尝试将数据从SQL服务器读入pandas数据框。下面是代码。

def get_data(size):
    con = pyodbc.connect(r'driver={SQL Server}; server=SPROD_RPT01; database=Reporting')
    cur = con.cursor()
    db_cmd = "select distinct top %s * from dbo.KrishAnalyticsAllCalls" %size
    res = cur.execute(db_cmd)
    sql_out = pd.read_sql_query(db_cmd, con, chunksize=10**6)
    frames = [chunk for chunk in sql_out]
    df_sql = pd.concat(frames)
    return df_sql

df = get_data(5000000)

我收到以下错误:

  

pandas.io.sql.DatabaseError:sql上的执行失败'选择distinct   来自dbo.KrishAnalyticsAllCalls'的前500000 *(' HY000',' [HY000]   [Microsoft] [ODBC SQL Server驱动程序]连接正忙于结果   另一个hstmt(0)(SQLExecDirectW)')

我之前执行过该函数并用ctrl+k中断执行,因为我想对函数进行更改。现在,在我尝试执行该功能后进行更改后,我收到了上述错误。

我怎么能杀死那个连接/ IPython内核,因为我不知道在函数中运行执行查询的任何IPython内核? 非常感谢您的帮助。非常感谢。

3 个答案:

答案 0 :(得分:0)

我面临着同样的问题。当我使用fetchall()函数时,此问题已修复。以下是我使用的代码。

import pypyodbc as pyodbc

def connect(self, query):
    con = pyodbc.connect(self.CONNECTION_STRING)
    cursor = con.cursor()
    print('Connection to db successful')
    cmd = (query)
    results = cursor.execute(cmd).fetchall()
    df = pd.read_sql(query, con)
    return df, results

使用cursor.execute(cmd).fetchall()代替cursor.execute(cmd)可以解决此问题。 希望这会有所帮助。

答案 1 :(得分:0)

问题是由于在pd.read_sql_query()命令之前执行了游标。 Pandas正在使用连接和SQL String来获取数据。不需要DB Cursor。

#res = cur.execute(db_cmd)
sql_out = pd.read_sql_query(db_cmd, con, chunksize=10**6)
print(sql_out)

答案 2 :(得分:0)

很可能您还没有连接到 SQL 服务器。或者,您在之前的实例中为运行的不同 SQL 查询进行了连接。无论哪种方式,您都需要重新建立连接。

import pyodbc as pyodbc
conn = pyodbc.connect('Driver={YOUR_DRIVER};''Server=YOUR_SERVER;''Database=YOUR_DATABASE;''Trusted_Connection=yes')

然后执行您的 SQL:

sql = conn.cursor()
sql.execute("""ENTER YOUR SQL""")

然后转化为 Pandas:

df = pd.DataFrame.from_records(sql.fetchall(),columns=[desc[0] for desc in sql.description])
相关问题