Я хочу, чтобы соединение с базой данных было как можно более открытым, потому что этот код будет работать на интенсивно используемом сервере, и люди уже сказали мне, что соединения с базами данных всегда должны быть закрыты как можно скорее.
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
Я считаю, что соединение с базой данных остается открытым, когда в таблице нет строки, хотя Я все еще не совсем уверен, как оно работает .
В любом случае, может быть, это плохой дизайн в том смысле, что я могу открывать и закрывать соединение с БД после каждого небольшого блока execute
. И конечно, я мог бы просто добавить close
прямо перед return
в этом случае ...
Но как мне всегда правильно закрыть БД, не беспокоясь о том, есть ли у меня return
, или raise
, или continue
, или что-то посередине? Я имею в виду нечто вроде блока кода, похожего на использование try
, как в следующем предложении, которое, очевидно, не работает:
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
Я не думаю, что есть что-то похожее на ExitingCodeBlock
за исключением, хотя я знаю, что есть try else
, но я надеюсь, что Python уже имеет подобную функцию ...
Или, может быть, кто-то может предложить мне парадигму и сказать, что это ужасно, и настоятельно советую мне никогда этого не делать. Может быть, это просто то, о чем не стоит беспокоиться, и пусть MySQLdb справится с этим, или это так?