我有一个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