2013-05-21 12 views
6

ho il seguente codice:cursore SQLite in Python con la dichiarazione

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

Quando chiamo questo metodo, mi butta il seguente errore: AttributeError: 'sqlite3.Connection' object has no attribute 'fetchone' Che cosa sto facendo di sbagliato?

+0

cosa ha la connessione self? un oggetto di connessione? o forse ti stai dimenticando di chiamare la funzione self.connection.cursor() .... – Netwave

+0

Sì, 'self.connection' ha un oggetto di connessione (' self.connection = sqlite3.connection ('file.db') ') . Dove dovrei chiamare il metodo 'cursor()'? Il modulo sqlite non associa la connessione dall'istruzione 'with' a un cursore? – linkyndy

+1

Lo fa, ma l'oggetto cursore è un'istanza separata, ed è necessario crearlo manualmente per accedere a "cur.execute'" usando cur = self.connection.cursor() '. – eandersson

risposta

13

Il motivo per cui si riceve l'errore è perché la classe di connessione non ha un metodo chiamato fetchone. È necessario aggiungere .cursor() per creare un'istanza di cursore e quindi avvolgerlo con closing affinché funzioni in un'istruzione with.

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

Il modo più semplice per affrontare questo è quello di rimuovere l'istruzione with e chiudere manualmente il cursor.

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

Mi getta "AttributeError: __exit__' now ... – linkyndy

+0

Ho aggiornato la mia risposta @linkyndy. – eandersson

+2

OK, l'ho risolto creando un'istanza separata dell'oggetto Cursore all'interno dell'istruzione with. Grazie per la segnalazione – linkyndy

Problemi correlati