我有一个在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
答案 0 :(得分:0)
每次我需要执行查询时,我都可以通过打开/关闭连接来解决这个问题。
with ceODBC.connect(self.CONNECT_STR) as conn:
result = pandas.read_sql(sql, conn)