Tôi có ứng dụng python có nhiều chức năng truy cập cơ sở dữ liệu nhỏ, sử dụng sqlalchemy. Tôi đang cố gắng để tránh có rất nhiều phiên mã boilerplate xử lý xung quanh các chức năng này.Tránh mã xử lý phiên soạn sẵn trong các hàm sqlalchemy
Tôi có rất nhiều chức năng mà giống như thế này:
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()
Tôi cố gắng để cấu trúc lại các chức năng này, nhưng không chắc là tôi có cách tiếp cận tốt nhất được nêu ra. Điều tốt nhất tôi hiện có là:
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)
Có cách nào tốt hơn hoặc thành ngữ hơn để thực hiện việc này không? Có lẽ sử dụng một trang trí?
Cảm ơn, gợi ý Jon
Trình quản lý ngữ cảnh 'sẽ là một cách rất tốt để thực hiện. –