私は、sqlalchemyを使用して、小さなデータベースアクセス関数をたくさん持っているpythonアプリケーションを持っています。私はこれらの関数の周りに定型的なセッション処理コードがたくさんあることを避けようとしています。sqlalchemy関数のボイラープレートセッション処理コードの回避
私はこのような何かを見て多くの機能があります:私は、これらの機能をリファクタリングしようとしているが、私はまだ最善のアプローチを持っていることを確認しておりません
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)
これを行うには、より良い方法や慣用的な方法がありますか?おそらくデコレータを使用していますか?
おかげで、コンテキストマネージャを使用する ジョン
「コンテキストマネージャー」は非常に良い方法です。 –