В cx_Oracle (или Oracle в целом), это возможный выделить курсор для каждого запроса или снова использовать курсор через несколько запросов.
def getSomeData(curs): # case 1: pass in a cursor, which is generally
curs.execute('select ...') # reused across queries
return curs.fetchall()
def getSomeData(conn): # case 2: pass in a connection,allocate
curs=conn.cursor() # a cursor for this query
curs.execute('select ...')
return curs.fetchall()
Конечно, оба подхода возвращают те же данные.
Каковы компромиссы между двумя подходами? Каждый особенно более или менее эффективен? Там какие-либо потенциальные ловушки к многократному использованию курсора по многим запросам?
Вы можете повторно использовать курсор CX_ORCACLE столько, сколько вам нравится, нет проблем. Если вы выполняете тысячи небольших запросов в небольшом пространстве времени, вы могут , см. Небольшое улучшение производительности путем повторного использования курсора, но я сомневаюсь в этом.
Я иногда создаю новые курсоры, и в других случаях повторно используйте существующий, в зависимости от того, облегчает ли это код для чтения и понимания.
Например, если у меня есть множество процедур, которые необходимо получить доступ к базе данных, я мог бы передавать объект соединения Oracle, либо курсор, созданный на этом соединении.
Все, что делает ваш код более читаемым и легче поддерживать, это то, на что я бы пошел.