我有一個python應用程序,它有很多小型數據庫訪問函數,使用sqlalchemy。我試圖避免在這些函數週圍有大量的樣板會話處理代碼。在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)
是否有這樣做的更好或更地道的方式?也許使用裝飾器?
感謝, 喬恩
'上下文管理器'將是一個非常好的方法。 – 2013-02-10 15:58:48