這是場景。在你的函數中,你使用遊標執行語句,但其中一個失敗並拋出異常。在關閉它正在處理的光標之前,程序退出該功能。光標會浮動佔據空間嗎?我必須關閉光標嗎?在與SQLite的Python是否有必要關閉遊標?
此外,Python文檔具有光標使用的例子,並說:「我們也可以關閉遊標,如果我們用它做。」關鍵字是「可以」,而不是「必須」。這是什麼意思呢?
這是場景。在你的函數中,你使用遊標執行語句,但其中一個失敗並拋出異常。在關閉它正在處理的光標之前,程序退出該功能。光標會浮動佔據空間嗎?我必須關閉光標嗎?在與SQLite的Python是否有必要關閉遊標?
此外,Python文檔具有光標使用的例子,並說:「我們也可以關閉遊標,如果我們用它做。」關鍵字是「可以」,而不是「必須」。這是什麼意思呢?
你不一定要打電話close()
上的光標;它可以像任何其他物體一樣被垃圾收集。
但即使等待垃圾回收聲音效果良好,我認爲這將是很好的風格仍然以確保資源(如數據庫)光標被關閉,無論是否有異常。
這可能是一個好主意(儘管它可能沒有多大關係使用SQLite,不知道在那裏,但它會讓你的代碼的可移植性)。此外,使用最近的Python(2.5+),很容易:
from __future__ import with_statement
from contextlib import closing
with closing(db.cursor()) as cursor:
# do some stuff
我還沒有看到sqlite3.Cursor.close()
操作的任何影響。
閉幕後,你仍然可以調用fetch(all|one|many)
將從之前的執行語句返回其餘結果。即使是運行Cursor.execute()
仍然工程...
有趣的是,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__
被調用)。從這一點開始,光標將無法使用;如果用光標嘗試進行任何操作,將會引發
ProgrammingError
異常。
該代碼將自動關閉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)
我發現同樣的行爲(我不得不寫,以確保關閉遊標測試,它失敗了),並想知道如果它是一個Python連接問題或固有的sqlite3的東西。 – haridsv 2011-11-25 01:21:54