2010-02-24 46 views
27

這是場景。在你的函數中,你使用遊標執行語句,但其中一個失敗並拋出異常。在關閉它正在處理的光標之前,程序退出該功能。光標會浮動佔據空間嗎?我必須關閉光標嗎?在與SQLite的Python是否有必要關閉遊標?

此外,Python文檔具有光標使用的例子,並說:「我們也可以關閉遊標,如果我們用它做。」關鍵字是「可以」,而不是「必須」。這是什麼意思呢?

回答

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

我發現同樣的行爲(我不得不寫,以確保關閉遊標測試,它失敗了),並想知道如果它是一個Python連接問題或固有的sqlite3的東西。 – haridsv 2011-11-25 01:21:54

1

有趣的是,Python 3.0 doc說:「我們也可以關閉遊標,如果我們用它做」,而Python 2.73.6醫生說:「我們也可以關閉連接如果我們完成了「。

Python的2.7和3.0-3.4文檔不說明遊標.close()方法。但是Python的3.5和3.6文檔描述cursor .close()方法:

關閉光標現在(而不是每當__del__被調用)。

從這一點開始,光標將無法使用;如果用光標嘗試進行任何操作,將會引發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) 
相關問題