pandas.read_sql'无效的游标状态'

时间:2014-11-21 01:46:50

标签: python pandas sqlalchemy pyodbc

我有一个在Apache下运行的烧瓶python应用程序(使用mod_wsgi)。特定的URL将导致应用程序使用pandas和ceODBC查询Microsoft数据库。

ret = pandas.read_sql(sql_str, self._connection)

上面的sql是一个非常基本的选择'在一张桌子上,没有任何加入。 在开发过程中,这不是问题(可能是因为Flask是单线程的)。 但是在运行时,应用程序在Apache下运行,我有一个特定页面,可以同时发出6个同一个URL。通常这会导致以下异常:

  File "C:\proj\pd_test\py_virt_env\Lib\site-packages\pandas\io\sql.py", line 1046, in read_sql
    cursor = self.execute(*args)
  File "C:\proj\pd_test\py_virt_env\Lib\site-packages\pandas\io\sql.py", line 1041, in execute
    raise_with_traceback(ex)
  File "C:\proj\pd_test\py_virt_env\Lib\site-packages\pandas\io\sql.py", line 1030, in execute
    cur.execute(*args)
DatabaseError: Execution failed on sql....

当时我觉得状态变坏了,所以后续调用会导致这样的异常:

File "C:\proj\pd_test\py_virt_env\Lib\site-packages\pandas\io\sql.py", line 421, in read_sql
    coerce_float=coerce_float, parse_dates=parse_dates)
  File "C:\proj\pd_test\py_virt_env\Lib\site-packages\pandas\io\sql.py", line 1048, in read_sql
    data = self._fetchall_as_list(cursor)
  File "C:\proj\pd_test\py_virt_env\Lib\site-packages\pandas\io\sql.py", line 1061, in _fetchall_as_list
    result = cur.fetchall()
DatabaseError: [Microsoft][ODBC SQL Server Driver]Invalid cursor state

  File "C:\proj\pd_test\py_virt_env\Lib\site-packages\pandas\io\sql.py", line 421, in read_sql
    coerce_float=coerce_float, parse_dates=parse_dates)
  File "C:\proj\pd_test\py_virt_env\Lib\site-packages\pandas\io\sql.py", line 1048, in read_sql
    data = self._fetchall_as_list(cursor)
  File "C:\proj\pd_test\py_virt_env\Lib\site-packages\pandas\io\sql.py", line 1061, in _fetchall_as_list
    result = cur.fetchall()
DatabaseError: [Microsoft][ODBC SQL Server Driver]Function sequence error

这是一个多线程问题吗? pandas.read_sql可以同时处理多个同时读取连接吗?也许问题是它是否为每次读取使用相同的光标或不同的光标?我正在使用的驱动程序是ceODBC

1 个答案:

答案 0 :(得分:0)

每次我需要执行查询时,我都可以通过打开/关闭连接来解决这个问题。

with ceODBC.connect(self.CONNECT_STR) as conn:
    result = pandas.read_sql(sql, conn)