pyodbc: How to retry to recover from Transient errors?
14,724
Per my experience, I think may be you can try to use the code below to implement the retry logic.
import time
retry_flag = True
retry_count = 0
while retry_flag and retry_count < 5:
try:
cursor.execute(query, [args['type'], args['id']])
retry_flag = False
except:
print "Retry after 1 sec"
retry_count = retry_count + 1
time.sleep(1)
Hope it helps.
Author by
90abyss
Updated on June 16, 2022Comments
-
90abyss almost 2 years
I've an API hosted on Flask. It runs behind a Tornado server. What is happening is that sometimes changes made on the UI are not reflected in the database. Also a few of the scripts I have running gives any of the 3 following errors:
- pyodbc.Error: ('08S01', '[08S01] [Microsoft][ODBC SQL Server Driver]Communication link failure (0) (SQLExecDirectW)')
- pyodbc.Error: ('01000', '[01000] [Microsoft][ODBC SQL Server Driver][DBNETLIB]ConnectionWrite (send()). (10054) (SQLExecDirectW)')
- pyodbc.Error: ('01000', '[01000] [Microsoft][ODBC SQL Server Driver][DBNETLIB]ConnectionRead (recv()). (10054) (SQLExecDirectW)')
This is the snippet of my Flask API code:
class Type(Resource): def put(self): parser = reqparse.RequestParser() parser.add_argument('id', type = int) parser.add_argument('type', type = int) args = parser.parse_args() query = """ UPDATE myDb SET Type = ? WHERE Id = ? """ connection = pyodbc.connect(connectionString) cursor = connection.cursor() cursor.execute(query, [args['type'], args['id']]) connection.commit() cursor.close() connection.close() api.add_resource(Type, '/type')
Is there any retry logic I can add on the cursor.execute line? I've no idea how to deal with transient errors with python. Please help.
-
90abyss over 7 yearsThis seems to be working as expected. Thanks a lot, Peter. :)
-
Karan M almost 6 yearsI am facing a similar issue in my python script. But, I have used my sql query like this:
import pyodbc @property def sqlquery(self): conn = pyodbc.connect("Driver={SQL Server};" "Server=server1;" "Database=db1;" "Trusted_Connection=yes;") cursor = conn.cursor() cursor.execute('SELECT TOP(10) * FROM xyz') for row in cursor: print('row = %r' % (row,)) return row conn.close()
Can you please help me how to integrate this code into the function? -
Anurag Sharma over 3 yearsStill giving the same error. Tried increasing the retry time also.