Voglio impedire che la connessione al database sia aperta il più possibile, perché questo codice verrà eseguito su un server ad uso intensivo e le persone mi hanno già detto che le connessioni al database dovrebbero essere sempre chiuse il prima possibile.In Python, come assicurarsi che la connessione al database si chiuda sempre prima di lasciare un blocco di codice?
def do_something_that_needs_database():
dbConnection = MySQLdb.connect(host=args['database_host'], user=args['database_user'], passwd=args['database_pass'], db=args['database_tabl'], cursorclass=MySQLdb.cursors.DictCursor)
dbCursor = dbConnection.cursor()
dbCursor.execute('SELECT COUNT(*) total FROM table')
row = dbCursor.fetchone()
if row['total'] == 0:
print 'error: table have no records'
dbCursor.execute('UPDATE table SET field="%s"', whatever_value)
return None
print 'table is ok'
dbCursor.execute('UPDATE table SET field="%s"', another_value)
# a lot more of workflow done here
dbConnection.close()
# even more stuff would come below
credo che lascia una connessione al database aperto quando non c'è fila sul tavolo, tho I'm still really not sure how it works.
In ogni caso, forse questo è un cattivo progetto nel senso che potrei aprire e chiudere una connessione DB dopo ogni piccolo blocco di execute
. E certo, ho potuto solo aggiungere un close
a destra prima del return
in questo caso ...
Ma come potevo sempre correttamente chiudere il DB senza doversi preoccupare se ho che return
, o un raise
, o continue
, o qualunque cosa nel mezzo? Sto pensando a qualcosa di simile a un blocco di codice, simile ad usare try
, come nel seguente suggerimento, che ovviamente non funziona:
def do_something_that_needs_database():
dbConnection = MySQLdb.connect(host=args['database_host'], user=args['database_user'], passwd=args['database_pass'], db=args['database_tabl'], cursorclass=MySQLdb.cursors.DictCursor)
try:
dbCursor = dbConnection.cursor()
dbCursor.execute('SELECT COUNT(*) total FROM table')
row = dbCursor.fetchone()
if row['total'] == 0:
print 'error: table have no records'
dbCursor.execute('UPDATE table SET field="%s"', whatever_value)
return None
print 'table is ok'
dbCursor.execute('UPDATE table SET field="%s"', another_value)
# again, that same lot of line codes done here
except ExitingCodeBlock:
closeDb(dbConnection)
# still, that "even more stuff" from before would come below
Non credo che ci sia qualcosa di simile a ExitingCodeBlock
un'eccezione , tho so che c'è la provareelse
, ma spero Python già una funzionalità simile ...
O forse qualcuno mi può suggerire una mossa paradigma e mi dicono questo è terribile e altamente consigliarmi di non faccio mai quella. Forse questo è solo qualcosa di cui non ti preoccupare e lascia che MySQLdb lo gestisca, o è così?
oh bene, dopo che tu e Michael avete modificato le vostre risposte ne abbiamo 2 molto simili e completi ... difficili da scegliere. – cregox