Chcę zapobiec jak największemu otwarciu połączenia z bazą danych, ponieważ ten kod będzie działał na intensywnie używanym serwerze, a ludzie tutaj już mi powiedzieli, że połączenia z bazą danych powinny być zawsze zamykane tak szybko, jak to możliwe.W Pythonie, jak upewnić się, że połączenie z bazą danych zawsze się zamknie przed opuszczeniem bloku kodu?
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
Wierzę, że pozostawia otwarte połączenie z bazą danych, gdy nie ma rząd na stole, tho I'm still really not sure how it works.
W każdym razie, może to jest zły projekt w tym sensie, że mogę otworzyć i zamknąć połączenie DB po każdym małym bloku z execute
. I na pewno, mogę tylko dodać close
tuż przed return
w takim razie ...
Ale jak zawsze mogłem prawidłowo zamknąć DB bez konieczności martwienia się, czy mam to return
albo raise
lub continue
lub cokolwiek w środku? Zastanawiam się w coś w rodzaju bloku kodu, podobnie jak przy użyciu try
, jak w poniższym sugestii, co oczywiście nie działa:
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
I nie sądzę, że istnieje coś podobnego do ExitingCodeBlock
wyjątek , tho wiem, że jest spróbowaćelse
, ale mam nadzieję, że Python już podobną funkcję ...
a może ktoś może zaproponować mi ruch paradygmatu i powiedz mi, że to jest okropne i bardzo mi doradzić, aby nie zrobić że. Może to po prostu coś, o co nie należy się martwić i czy MySQLdb sobie z tym poradzi?
cóż, po tym, jak ty i Michael zredagowaliście swoje odpowiedzi, mamy 2 bardzo podobne i kompletne ... trudne do wybrania. – cregox