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

Kri*_*lal 8 python sql-server pyodbc pandas

我正在尝试将 SQL Server 中的数据读取到 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)
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

pandas.io.sql.DatabaseError:执行失败 sql 'select different top 500000 * from dbo.KrishAnalyticsAllCalls': ('HY000', '[HY000] [Microsoft][ODBC SQL Server Driver]连接正忙于另一个 hstmt 的结果(0) (SQLExecDirectW)')

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

由于我不知道有任何 IPython 内核正在运行并在函数中执行查询,因此如何终止该连接/IPython 内核?

小智 14

我面临着同样的问题。当我使用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
Run Code Online (Sandbox Code Playgroud)

使用cursor.execute(cmd).fetchall()而不是cursor.execute(cmd)解决它。希望这可以帮助。


小智 5

该问题是由于游标在 pd.read_sql_query() 命令之前执行所致。Pandas 使用连接和 SQL 字符串来获取数据。不需要 DB 游标。

#res = cur.execute(db_cmd)
sql_out = pd.read_sql_query(db_cmd, con, chunksize=10**6)
print(sql_out)
Run Code Online (Sandbox Code Playgroud)