Reputation: 9899
I often get this error: ProgrammingError: The cursor's connection has been closed.
Is there a way to check whether the connection I am using has been closed before I attempt to execute a query?
I'm thinking of writing a wrapper to execute queries. First it would check whether the connection is closed, if it is, it would reconnect. Is this an advisable way of doing this?
Upvotes: 13
Views: 36363
Reputation: 9704
You can also do duck typing. Use what you need and catch the exception. 99% of the time it is likely to be OK.
Upvotes: 1
Reputation: 169
Another option would be to check if you can get a cursor (many times that's what you want from a connection anyway) and re-initialize the connection otherwise. It will look something like this:
try:
cursor = conn.cursor()
except e:
if e.__class__ == pyodbc.ProgrammingError:
conn == reinit()
cursor = conn.cursor()
Upvotes: 5
Reputation: 328594
The wrapper is a good idea but I don't know any API to reliably check whether the connection is closed or not.
So the solution would be something along these lines:
for retry in range(3):
try:
... execute query ...
return # Stop on success
except e:
if is_connection_broken_error(e):
reconnect()
continue
raise
raise # throw if the retry fails too often
Upvotes: 8