Ho un'applicazione python con molte funzioni di accesso al database, utilizzando sqlalchemy. Sto cercando di evitare di avere un sacco di codice di gestione delle sessioni di codice in merito a queste funzioni.Evitare il codice di gestione della sessione di codice in sqlalchemy
devo numerose funzioni che sembrano qualcosa di simile:
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()
sto cercando di refactoring queste funzioni, ma non sono sicuro che avere il miglior approccio ancora. Il migliore che attualmente ho è il seguente:
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)
Esiste un modo migliore o più idiomatico per farlo? Forse usando un decoratore?
Grazie, suggerimento Jon
Un 'context manager' sarebbe un ottimo modo per andare. –