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: