2010-02-24 2 views
27

Вот сценарий. В вашей функции вы выполняете инструкции с помощью курсора, но один из них терпит неудачу и генерируется исключение. Ваша программа выходит из функции перед закрытием курсора, с которым она работала. Будет ли курсор перемещаться вокруг места? Мне нужно закрыть курсор?В Python с sqlite необходимо закрыть курсор?

Кроме того, документация на Python содержит пример использования курсора и говорит: «Мы также можем закрыть курсор, если мы с ним закончим». Ключевое слово «can», а не «must». Что они означают именно этим?

ответ

7

Вы не обязаны называть курсор close(); это может быть сбор мусора, как любой другой объект.

Но даже если ожидание сборки мусора звучит нормально, я думаю, что было бы хорошим стилем, чтобы убедиться, что ресурс, такой как курсор базы данных, закрывается независимо от того, существует ли исключение.

15

Это, вероятно, хорошая идея (хотя, возможно, это не имеет особого значения для sqlite, не знаю, но это сделает ваш код более портативным). Кроме того, с недавнего Python (2.5+), это легко:

from __future__ import with_statement 
from contextlib import closing 

with closing(db.cursor()) as cursor: 
    # do some stuff 
5

Я не видел никакого эффекта для sqlite3.Cursor.close() работы еще.

После закрытия вы все равно можете позвонить fetch(all|one|many), который вернет остальные результаты из предыдущего оператора выполнения. Даже работает Cursor.execute() все еще работает ...

+1

я заметил такое же поведение (у меня был тест написанный чтобы убедиться, что курсор закрыт, и это не удалось), и интересно, если это вопрос разъем питона или что-то присущее с sqlite3. – haridsv

1

Интересно, что Python 3.0 doc говорит: «Мы можем закрыть курсор, если мы сделали с ним», в то время как Python 2.7 и 3.6 док говорит: «Мы можем закрыть соединение если мы делаются с ним ».

Документы Python 2.7 и 3.0-3.4 не описывают курсор .close(). Но Python 3.5 и 3.6 документы описывают cursor .close() метод:

Закрыть курсор сейчас (а не всякий раз, когда __del__ называется).

Курсор будет недоступен с этой точки вперед; a ProgrammingError исключение будет поднято, если любая операция будет предпринята с помощью курсора.

0

Этот код будет автоматически закрыт Cursor. Он также автоматически закроет и зафиксирует Connection.

import sqlite3 
import contextlib 

def execute_statement(statement): 
    with contextlib.closing(sqlite3.connect(path_to_file)) as conn: # auto-closes 
     with conn: # auto-commits 
      with contextlib.closing(conn.cursor()) as cursor: # auto-closes 
       cursor.execute(statement) 
Смежные вопросы