Ответ 1
Как мне нравится подходить к этому - поместить весь мой код базы данных в лямбда или закрытие и передать это в вспомогательную функцию, которая будет обрабатывать catching исключение разъединения и повторить попытку.
Итак, с вашим примером:
import sqlalchemy as SA
def main():
def query():
for name in session.query(Names):
print name
run_query(query)
def run_query(f, attempts=2):
while attempts > 0:
attempts -= 1
try:
return f() # "break" if query was successful and return any results
except SA.exc.DBAPIError as exc:
if attempts > 0 and exc.connection_invalidated:
session.rollback()
else:
raise
Вы можете сделать это более фантастическим, передав логическое значение в run_query
, чтобы обрабатывать случай, когда вы только читаете, и поэтому хотите повторить попытку, не откатываясь назад.
Это поможет вам выполнить принцип DRY, поскольку весь уродливый код котельной для управления повторными попытками + откатывается в одном месте.