Мы экспериментировали с обработкой отладки sqlalchemy и тем, как она интегрируется с ORM. Мы изучили документы, и, похоже, советуем уловить исключение разъединения, выдать rollback()
и повторить код.
например:
import sqlalchemy as SA
retry = 2
while retry:
retry -= 1
try:
for name in session.query(Names):
print name
break
except SA.exc.DBAPIError as exc:
if retry and exc.connection_invalidated:
session.rollback()
else:
raise
Я следую логике: вам нужно откатить любые активные транзакции и воспроизвести их, чтобы обеспечить последовательный порядок ваших действий.
НО - это означает, что добавляется много дополнительного кода для каждой функции, которая хочет работать с данными. Кроме того, в случае SELECT
мы не изменяем данные, и концепция отката/повторного запроса не только неприглядна, но и нарушает принцип DRY (не повторяйте себя).
Мне было интересно, не будут ли другие люди делиться тем, как они обрабатывают разъединения с sqlalchemy.
FYI: мы используем sqlalchemy 0.9.8 и Postgres 9.2.9