【问题标题】:DatabaseError: ('HY000', '[HY000] [Microsoft][ODBC SQL Server Driver]Connection is busy with results for another hstmt (0) (SQLExecDirectW)')DatabaseError: ('HY000', '[HY000] [Microsoft][ODBC SQL Server Driver]Connection is busy with results for another hstmt (0) (SQLExecDirectW)')
【发布时间】:2017-11-17 16:27:06
【问题描述】:

我正在尝试将数据从 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)

我收到以下错误:

pandas.io.sql.DatabaseError: sql 'select distinct 执行失败 前 500000 * 来自 dbo.KrishAnalyticsAllCalls': ('HY000', '[HY000] [Microsoft][ODBC SQL Server Driver]Connection is busy with results for 另一个 hstmt (0) (SQLExecDirectW)')

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

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

【问题讨论】:

  • 如果您在 Python shell/IDE 中工作,那么您可能需要将其关闭并重新启动以终止“僵尸”连接。
  • 是的,我已经这样做了。我也试过关闭整个计算机,但仍然出现同样的错误。

标签: python sql-server pandas pyodbc


【解决方案1】:

我也面临同样的问题。当我使用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) 解决了它。 希望这会有所帮助。

【讨论】:

    【解决方案2】:

    问题是由于光标在 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)
    

    【讨论】:

      【解决方案3】:

      很可能您还没有连接到 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""")
      

      然后变成熊猫:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-09-03
        • 2018-02-23
        • 1970-01-01
        • 2021-09-01
        • 2020-02-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多