2013-05-21 11 views
6

Mam następujący kod:SQLite kursor w Pythonie z oświadczeniem

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

Kiedy wywołać tę metodę, to rzuca mi następujący błąd: AttributeError: 'sqlite3.Connection' object has no attribute 'fetchone' Co robię źle?

+0

co ma self.connection? obiekt połączenia? a może zapominasz zadzwonić do funkcji self.connection.cursor() ... – Netwave

+0

Tak, 'self.connection' ma obiekt połączenia (' self.connection = sqlite3.connection ('file.db') ') . Gdzie powinienem wywołać metodę 'cursor()'? Czy moduł sqlite nie kojarzy połączenia z instrukcji 'with' z kursorem? – linkyndy

+1

Robi to, ale obiekt kursora jest oddzielną instancją i trzeba ją utworzyć ręcznie, aby uzyskać dostęp do 'cur.execute'' przy użyciu funkcji cur = self.connection.cursor() '. – eandersson

Odpowiedz

13

Powodem otrzymania błędu jest to, że klasa połączenia nie ma metody o nazwie fetchone. Aby utworzyć instancję kursora, musisz dodać .cursor(), a następnie zawiń go w closing, aby działał w instrukcji with.

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

Najprostszym sposobem radzenia sobie z tym jest usunięcie komunikatu with i ręcznie zamknąć cursor.

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

Rzuca mi "AttributeError: __exit__' teraz ... – linkyndy

+0

Zaktualizowałem moją odpowiedź @ linkyndy. – eandersson

+2

OK, rozwiązałem go, tworząc oddzielną instancję obiektu Cursor wewnątrz instrukcji with. Dziękuję za wskazanie tego – linkyndy

Powiązane problemy