2009-05-08 41 views
18

tôi đang cố gắng để có được những rowcount của một sqlite3cursor trong chương trình Python3k của tôi, nhưng tôi bối rối, như rowcount luôn là -1, bất chấp những gì Python3 tài liệu nói (trên thực tế nó là mâu thuẫn, nó phải là None). Ngay cả sau khi tìm nạp tất cả các hàng, rowcount vẫn ở -1. Đây có phải là lỗi sqlite3 không? Tôi đã kiểm tra nếu có các hàng trong bảng.cursor.rowcount luôn -1 trong sqlite3 trong python3k

Tôi có thể thực hiện việc kiểm tra này nếu số fetchone() trả về một cái gì đó khác với None, nhưng tôi nghĩ rằng vấn đề này sẽ rất thú vị để thảo luận.

Cảm ơn.

+0

"thực sự nó là mâu thuẫn ..." Vui lòng cung cấp một tài liệu tham khảo hoặc một liên kết cho điều này. –

+0

http://docs.python.org/3.0/library/sqlite3.html?highlight=sqlite#sqlite3.Cursor Có thể tôi đã hiểu sai nhưng đoạn cuối của Cursor.rowcount cho biết "Điều này bao gồm các câu lệnh SELECT vì chúng tôi không thể xác định số hàng mà một truy vấn được tạo ra cho đến khi tất cả các hàng được tìm nạp. " Vì vậy, tôi đoán rằng sau khi lấy chúng phù thủy fetchone() hoặc fetchall() tôi sẽ nhận được một số đếm cập nhật. cảm ơn – Hiperi0n

+0

Khi sử dụng gói 'mysql.connector' thuộc tính rowcount là -1 sau lệnh gọi .execute của lệnh SELECT, nhưng sau hàm fetchall() gọi số hàng thực tế trong dữ liệu' fetch'ed là trả lại. Chỉ cần quan sát ... – Duffau

Trả lời

16

Từ documentation:

Theo yêu cầu của Python DB API Spec, thuộc tính rowcount “là -1 trong trường hợp không executeXX() đã được thực hiện trên con trỏ hoặc các rowcount của hoạt động cuối cùng không thể xác định được bởi giao diện ”.

này bao gồm SELECT báo cáo bởi vì chúng tôi không thể xác định số hàng một truy vấn được sản xuất cho đến khi tất cả hàng là lấy.

Điều đó có nghĩa tất cảSELECT báo cáo sẽ không có một rowcount. Hành vi bạn đang quan sát được ghi lại.

EDIT: Tài liệu không nói bất cứ nơi nào mà rowcountsẽ được cập nhật sau khi bạn làm một fetchall() nên nó chỉ là sai lầm khi cho rằng.

8

Thay vì "kiểm tra nếu một fetchone() trả về một cái gì đó khác với Không", tôi đề nghị:

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

đây là sqlite -only (không được hỗ trợ trong việc triển khai DB API khác) nhưng rất tiện dụng cho sqlite - mã Python cụ thể ( được ghi đầy đủ, xem http://docs.python.org/library/sqlite3.html).

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

Hàm fetchall() sẽ trả về danh sách các hàng được trả lại từ lựa chọn. Len của danh sách đó sẽ cung cấp cho bạn số lượng hàng.

+1

Thông báo chính của việc này là - nếu có thay đổi cuộc gọi này sẽ trả lại một số lượng hàng quá mức - bạn có thể kết thúc với các vấn đề về bộ nhớ. (Đây là lý do tại sao thực thi trả về một con trỏ [Python iterator] thay vì trả về một danh sách hoặc mảng rõ ràng). (Mặc dù trong trường hợp cụ thể của tôi, đây không phải là một mối quan tâm.) – Brad

7

Có thể đếm tốt hơn các hàng theo cách này:

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

Sử dụng PYCharm, trong chế độ gỡ lỗi, nếu bạn đặt con trỏ vào biến con trỏ, a + nhỏ sẽ xuất hiện, khi bạn click vào nó, bạn sẽ thấy các thuộc tính khác nhau của đối tượng của bạn.

Trong con trỏ của tôi về 1 phần tử, tôi thấy:

rowcount={int} 
arraysize={int}1 

Vì vậy, trong mã của bạn, chỉ cần sử dụng:

print(cursor.arraysize) 
1 
+0

Mảng của con trỏ kiểm soát số hàng được trả về bởi 'fetchmany()', và là 1 theo mặc định. Nó không liên quan gì đến số lượng hàng –

Các vấn đề liên quan