Более простой альтернативой будет использование объекта соединения с менеджером контекста, как указано в docs .
with con:
con.execute(...)
Если вы настаиваете на работе с курсором(по причинам), тогда почему бы не создать свой собственный класс-обертку?
class SafeCursor:
def __init__(self, connection):
self.con = connection
def __enter__(self):
self.cursor = self.con.cursor()
return self.cursor
def __exit__(self, typ, value, traceback):
self.cursor.close()
Затем вы будете называть свой класс следующим образом:
with SafeCursor(conn) as c:
c.execute(...)