【发布时间】:2014-11-21 01:46:49
【问题描述】:
我有一个在 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
【问题讨论】:
-
我想知道使用 sqlalchemy 引擎是否可以解决这个问题。
-
每次我需要执行查询时,我都能通过打开/关闭连接来解决,但我不确定我是否喜欢那个解决方案。我选择了 ceODBC,因为我发现它比 sqlAlchemy 和 pyOdbc 更快
-
这是没有料到的。您肯定必须关闭连接和游标。这就是我喜欢 sqlalchemy 的原因。为您处理好。
-
原则上,pandas 中仅支持 sqlalchemy 引擎来指定与数据库的连接,请参阅
con参数的文档字符串:pandas.pydata.org/pandas-docs/stable/generated/… -
好的..也许我会把我找到的解决方案作为那些可能遇到相同问题并且没有使用 sqlAlchemy 的人的答案。我不知道 sqlAlchemy 在执行查询时会打开和关闭连接。我想这是减少游标状态问题的一种方法,但来自 java/.net 世界似乎很奇怪,您经常打开一个连接并在会话期间保持打开状态。
标签: python pandas sqlalchemy pyodbc