Подтвердить что ты не робот

я должен повторно использовать курсор в модуле 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()
4b9b3361

Ответ 1

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

Что касается курсоров, то я понимаю, что лучше всего создать курсор на операцию/транзакцию. Поэтому некоторое check value → update value → read value type transaction может использовать один и тот же курсор, но для следующего вы создадите новый. Это снова указывает на направление построения внутреннего API для доступа к db вместо того, чтобы иметь общий метод executeSql.

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

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