sqlalchemy を使用して、多数の小さなデータベース アクセス関数を備えた Python アプリケーションがあります。私は、これらの関数の周りに多くの定型的なセッション処理コードを持たないようにしています。
次のような関数が多数あります。
def get_ticket_history(Session, ticket_id):
s = Session()
try:
rows = s.query(TicketHistory)\
.filter(TicketHistory.ticket_fk==ticket_id)\
.order_by(TicketHistory.id.desc()).all()
s.commit()
return rows
except:
s.rollback()
raise
finally:
s.close()
これらの関数をリファクタリングしようとしていますが、まだ最善のアプローチがあるかどうかはわかりません。私が現在持っている最高のものは次のとおりです。
def execute(Session, fn, *args, **kwargs):
s = Session()
try:
ret = fn(s, *args, **kwargs)
s.commit()
return ret
except:
s.rollback()
raise
finally:
s.close()
def get_ticket_history(self, ticket_id):
def sql_fn(s):
return s.query(TicketHistory)\
.filter(TicketHistory.ticket_fk==ticket_id)\
.order_by(TicketHistory.id.desc()).all()
return execute(self.sentinel_session, sql_fn)
これを行うためのより良い、またはより慣用的な方法はありますか? おそらくデコレータを使用していますか?
ありがとう、ジョン