я должен повторно использовать курсор в модуле MySQLdb python
Я пишу скрипт CGI на Python, который будет запрашивать базу данных MySQL. Я использую модуль MySQLdb. Поскольку база данных будет запрашиваться повторно, я написал эту функцию....
def getDatabaseResult(sqlQuery,connectioninfohere):
# connect to the database
vDatabase = MySQLdb.connect(connectioninfohere)
# create a cursor, execute and SQL statement and get the result as a tuple
cursor = vDatabase.cursor()
try:
cursor.execute(sqlQuery)
except:
cursor.close()
return None
result = cursor.fetchall()
cursor.close()
return result
Мой вопрос... Это лучшая практика? Должен ли я повторно использовать мой курсор в моих функциях? Например. Что лучше...
def callsANewCursorAndConnectionEachTime():
result1 = getDatabaseResult(someQuery1)
result2 = getDatabaseResult(someQuery2)
result3 = getDatabaseResult(someQuery3)
result4 = getDatabaseResult(someQuery4)
или покончить с функцией getDatabaseeResult и сделать что-то вроде..
def reusesTheSameCursor():
vDatabase = MySQLdb.connect(connectionInfohere)
cursor = vDatabase.cursor()
cursor.execute(someQuery1)
result1 = cursor.fetchall()
cursor.execute(someQuery2)
result2 = cursor.fetchall()
cursor.execute(someQuery3)
result3 = cursor.fetchall()
cursor.execute(someQuery4)
result4 = cursor.fetchall()
Ответы
Ответ 1
Разработчик MySQLdb рекомендует создать API-интерфейс, специфичный для приложений, который будет использовать для вас доступ к базе данных DB, так что вам не нужно беспокоиться о строках запроса mysql в коде приложения. Это сделает код более расширяемым (ссылка).
Что касается курсоров, то я понимаю, что лучше всего создать курсор на операцию/транзакцию. Поэтому некоторое check value → update value → read value
type transaction может использовать один и тот же курсор, но для следующего вы создадите новый. Это снова указывает на направление построения внутреннего API для доступа к db вместо того, чтобы иметь общий метод executeSql
.
Также не забудьте закрыть свои курсоры и зафиксировать изменения в соединении после выполнения запросов.
Однако ваша функция getDatabaseResult
не обязательно должна иметь соединение для каждого отдельного запроса. Вы можете делиться связью между запросами, пока вы несете ответственность за курсоры.