2009-05-08 22 views
18

benim Python3k programında bir sqlite3cursor ait rowcount almaya çalışıyorum, ancak rowcount Python3 dokümanlar söylediklerine rağmen, her zaman -1 olduğu gibi, şaşkın (aslında öyle çelişkili, None olmalıdır. Tüm satırları getirdikten sonra bile rowcount-1'da kalır. sqlite3 hatası mı? Tabloda satırlar olup olmadığını kontrol ettim.cursor.rowcount daima -1 python3k içinde sqlite3 içinde

fetchone()'un None'dan farklı bir şey döndürüp döndürmediğini kontrol edebilirim, ancak bu sorunun tartışılması güzel olacağını düşündüm.

Teşekkürler. Gönderen

+0

"aslında çelişkili olduğunu ..." bir başvuru verin veya Bunun için bir bağlantı. –

+0

http://docs.python.org/3.0/library/sqlite3.html?highlight=sqlite#sqlite3.Cursor Belki de yanlış anladım ama Cursor.rowcount'un son paragrafında "Bu SELECT ifadelerini içerir Tüm satırlar alınana kadar üretilen sorguların sayısını belirler. " Bu yüzden onları cadı fetchone() veya fetchall() getirildikten sonra güncel bir satır sayısı alacağını tahmin ettim. teşekkürler – Hiperi0n

+0

'mysql.connector' paketini kullanırken, rowcount özniteliği, bir SELECT deyiminin bir .execute çağrısından sonra -1 olur, ancak fetchall() çağrısından sonra," getirilen verilerdeki satırların gerçek sayısını arayın " iade. Sadece bir gözlem ... – Duffau

cevap

16

documentation: Python DB API Spec gereği

, Rowcount niteliği “dir -1 durumda hiçbir executeXX() imleç veya Rowcount üzerinde yapılmıştır içinde son işlemi arayüzü ile belirlenemez ”. Hepimizin satır getirilen olana kadar bir sorgu üretilen satır sayısını belirleyemez çünkü

Bu SELECT ifadeleri içerir. tümSELECT ifadeleri demektir

bir rowcount olmayacaktır. Gözlemlediğin davranış belgelendi.

DÜZENLEME: Bir fetchall() yaptıktan sonra Dokümantasyon yüzden varsaymak yanlış olduğunu her yerde olduğu rowcountgüncellenecektir olacak demiyor.

8

yerine "bir fetchone() Hiçbiri daha farklı bir şey dönerse kontrol" ı önermek:

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

bu -sadece sqlite (diğer DB API uygulamalarda desteklenmez) ama sqlite için çok kullanışlı - belirli Python kodu (ve tamamen belgelenmiştir, bkz. http://docs.python.org/library/sqlite3.html).

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

Fetchall(), seçimden döndürülen satırların bir listesini döndürür. Bu listenin Len numarası sana satır sayısını verecek.

+1

Bunun en büyük uyarısı - eğer bu aramanın çok fazla sayıda satır döndüreceği yönünde bir değişiklik varsa, bellek problemleri yaşayabilirsiniz. (Bu nedenle, execute açık bir liste veya dizi döndürmek yerine bir imleci [Python yineleyici] döndürür). (Özel durumumda olsa da, bu bir sorun değildi.) – Brad

7

daha iyi Satırlar bu şekilde saymak Mayıs: Eğer imleç değişken üzerinde imleci eğer bunu tıkladığınızda pycharm kullanma

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

, hata ayıklama modunda, küçük + görüyorsunuz, görünür nesnenizin farklı özellikleri.1 elemanın benim imleç olarak

, görüyorum:

rowcount={int} 
arraysize={int}1 

Yani, kodunuzda, sadece kullanın:

print(cursor.arraysize) 
1 
+0

İmleç dizisi, fetchmany() 'ile kaç satır döndürdüğünü ve varsayılan olarak 1 olduğunu denetler. Satır sayısı ile ilgisi yok –

İlgili konular