2009-05-08 6 views
18

Próbuję uzyskać rowcount o sqlite3cursor w moim programie Python3k, ale jestem zaskoczony, jak rowcount jest zawsze -1, pomimo tego, co docs Python3 powiedzieć (w rzeczywistości jest to sprzeczne, powinno być None). Nawet po pobraniu wszystkich wierszy, rowcount pozostaje na -1. Czy to błąd sqlite3? Sprawdziłem już, czy w tabeli są wiersze.cursor.rowcount zawsze -1 w sqlite3 w python3k

Mogę obejść to sprawdzenie, czy fetchone() zwróci coś innego niż None, ale myślałem, że to byłoby miłe do omówienia.

Dzięki.

+0

"w rzeczywistości jest to sprzeczne ..." Proszę podać nazwę lub link do tego. –

+0

http://docs.python.org/3.0/library/sqlite3.html?highlight=sqlite#sqlite3.Cursor Może źle się zrobiłem, ale ostatni akapit Cursor.rowcount mówi: "Obejmuje to instrukcje SELECT, ponieważ nie możemy określa liczbę wierszy, które wygenerowało zapytanie, aż wszystkie wiersze zostaną pobrane. " Tak więc domyślam się, że po ich pobraniu czarownicą fetchone() lub fetchall() dostanę zaktualizowany rząd wierszy. dzięki – Hiperi0n

+0

Podczas korzystania z pakietu 'mysql.connector' atrybut rowcount wynosi -1 po wywołaniu .execute instrukcji SELECT, ale po wywołaniu funkcji fetchall() faktyczna liczba wierszy w danych' pobieranie 'jest równa zwrócony. Po prostu spostrzeżenie ... – Duffau

Odpowiedz

16

Z documentation:

Zgodnie z wymaganiami pytona DB API SPEC atrybut rowcount „jest -1 w przypadku nie executeXX() zostało przeprowadzone na kursora lub rowCount z Ostatnia operacja nie jest możliwa do określenia przez interfejs ".

Obejmuje to SELECT oświadczenia ponieważ nie możemy określić liczbę wierszy zapytanie produkowanych aż wszystkie rzędy były naciągane.

Oznacza to wszystkieSELECT oświadczenia nie będzie miał rowcount. Zachowanie, które obserwujesz, jest udokumentowane.

EDIT: Dokumentacja nigdzie nie mówi, że rowcountbędzie być aktualizowane po wykonaniu fetchall() więc jest to po prostu przyjąć, że źle.

8

Zamiast "sprawdzenie czy fetchone() zwraca coś innego niż None", proponuję:

cursor.execute('SELECT * FROM foobar') 
for row in cursor: 
    ... 

to sqlite -tylko (nie jest obsługiwana w innych implementacjach API DB), ale bardzo przydatny dla sqlite - określony kod Pythona (i w pełni udokumentowany, patrz http://docs.python.org/library/sqlite3.html).

9
cursor = newdb.execute('select * from mydb;') 
print len(cursor.fetchall()) 

Funkcja fetchall() zwróci listę wierszy zwróconych przez select. Len tej listy da ci liczbę wierszy.

+1

Głównym zastrzeżeniem tego jest - jeśli jest zmiana, że ​​to połączenie zwróci nadmierną liczbę wierszy - możesz skończyć z problemami z pamięcią. (Z tego powodu execute zwraca kursor [iterator Pythona] zamiast zwracać jawną listę lub tablicę). (Chociaż w moim szczególnym przypadku nie było to problemem.) – Brad

7

Może lepiej liczyć wierszy w ten sposób:

print cur.execute("SELECT COUNT(*) FROM table_name").fetchone()[0] 
-2

Korzystanie pycharm, w trybie debugowania, jeśli umieścisz kursor na zmienną kursora pojawi się mała +, po kliknięciu na nią, widzisz różne właściwości twojego obiektu.

W moim kursorem 1 elementu, widzę:

rowcount={int} 
arraysize={int}1 

Więc w kodzie, wystarczy użyć:

print(cursor.arraysize) 
1 
+0

Arraysize kursora kontroluje liczbę wierszy zwracanych przez 'fetchmany()' i domyślnie wynosi 1. Nie ma nic wspólnego z liczbą wierszy –