Using with statement on cursor in cx_Oracle

cx_Oracle contains __enter__ а также __exit__ на объектах Connection, но не на объектах Cursor. Таким образом, я использую это везде, чтобы обернуть курсоры:

class CursorWrapper(object):
    def __init__(self, connection):
        self.connection = connection
        self.cursor = None

    def __enter__(self):
        self.cursor = self.connection.cursor()
        return self.cursor

    def __exit__(self, exc_type, exc_value, traceback):
       self.cursor.close()

тогда, когда я хочу курсор

with CursorWrapper(cnx) as cursor:
    cursor.execute("whatever sql statement")

Это вполне соответствует моим потребностям.

Однако мне тогда было интересно, что может помешать __enter__ а также __exit__ методы, которые будут добавлены непосредственно в cx_Oracle?

Или есть лучший способ использовать курсоры с контекстным управлением, которое объясняет, почему оно не определено в модуле?

РЕДАКТИРОВАТЬ: Извините, я только что нашел ответ. Я могу просто использовать contextlib.closing.

import contextlib
with contextlib.closing(cnx.cursor()) as cursor:

1 ответ

Решение перенесено из user3146720пост с вопросом.

Я могу просто использовать contextlib.closing.

       import contextlib
with contextlib.closing(cnx.cursor()) as cursor:
Другие вопросы по тегам