2013-05-21 80 views
6

我有以下代碼:SQLite的光標在Python with語句

def executeOne(self, query, parameters): 
    with self.connection as cursor:   
     cursor.execute(query, parameters) 
     return cursor.fetchone() 

當我調用這個方法,它拋出我下面的錯誤:AttributeError: 'sqlite3.Connection' object has no attribute 'fetchone' 我在做什麼錯?

+0

self.connection有什麼?一個連接對象?或者你忘了調用函數self.connection.cursor().... – Netwave

+0

是的,'self.connection'有一個連接對象('self.connection = sqlite3.connection('file.db')') 。我應該在哪裏調用cursor()方法? sqlite模塊不會將'with'語句的連接與遊標相關聯嗎? – linkyndy

+1

它的確如此,但遊標對象是一個單獨的實例,並且您需要手動創建以使用cur = self.connection.cursor()'來訪問'cur.execute''。 – eandersson

回答

13

您收到錯誤的原因是因爲連接類沒有名爲fetchone的方法。您需要添加.cursor()來創建遊標實例,然後使用closing對其進行包裝,以使其在with語句中工作。

from contextlib import closing 
with closing(self.connectio.cursor()) as cur: 

處理最簡單的方法是去除with聲明和手動關閉cursor

cur = self.connection.cursor() 
try: 
    cur.execute(query, parameters) 
    return cur.fetchone() 
finally: 
    cur.close() 
+0

它現在引發'AttributeError:__exit__' ... – linkyndy

+0

我更新了我的答案@linkyndy。 – eandersson

+2

好的,我已經通過在with語句中創建一個單獨的Cursor對象實例來解決它。感謝您指出了這一點 – linkyndy