Я хочу, чтобы соединение с базой данных было открыто как можно больше, потому что этот код будет работать на интенсивном используемом сервере, и люди здесь уже сказали, что подключения к базам данных всегда должны быть закрыты как можно скорее.
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 обрабатывает его или не так ли?