я должен повторно использовать курсор в модуле MySQLdb Python - PullRequest
18 голосов
/ 12 ноября 2011

Я пишу 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 Ответ

18 голосов
/ 12 ноября 2011

Разработчик MySQLdb рекомендует создать прикладной API, который обеспечивает доступ к БД, чтобы вам не приходилось беспокоиться о строках запроса mysql в коде приложения. Это сделает код немного более расширяемым ( ссылка ).

Что касается курсоров, я понимаю, что лучше всего создать курсор для каждой операции / транзакции. Таким образом, некоторые check value -> update value -> read value транзакции могут использовать тот же курсор, но для следующего вы создадите новый. Это снова указывает на направление построения внутреннего API для доступа к базе данных вместо использования общего метода executeSql.

Также не забудьте закрыть свои курсоры и зафиксировать изменения в соединении после выполнения запросов.

Ваша функция getDatabaseResult не требует подключения для каждого отдельного запроса. Вы можете разделить связь между запросами, если будете действовать с курсорами ответственно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...