Ich habe eine Python-Anwendung, die viele kleine Datenbankzugriffsfunktionen hat, mit sqlalchemy. Ich versuche zu vermeiden, dass viele Code Session Session Codes um diese Funktionen herumliegen.Vermeidung von BoilerPlate Session Handling Code in Sqlalchemy Funktionen
Ich habe zahlreiche Funktionen, die wie folgt aussehen:
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()
ich diese Funktionen Refactoring bin versucht, aber nicht sicher, ich habe die beste Ansatz noch. Das Beste, was ich derzeit habe, ist der folgende:
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)
Gibt es einen besseren oder mehr idiomatischen Weg, dies zu tun? Vielleicht mit einem Dekorateur?
Danke, Jon
Ein 'context manager' wäre ein sehr guter Weg. –