2011-02-06 128 views
2

所以我讀過the documentation由select語句返回的行數和它說:在Python的sqlite3的模塊,爲什麼不能cursor.rowcount()告訴我

Cursor.rowcount¶

儘管sqlite3模塊的光標類實現了這個 屬性,但支持確定「行 受影響」/「所選行」的數據庫引擎自己的 是古怪的。

這包括SELECT語句 ,因爲我們不能確定查詢產生,直到所有 行是牽強的行數 。

爲什麼在執行SELECT後馬上就不能用它來確定返回的行數。這個查詢當然已經執行了,現在已經取得了所有的行?

回答

9

當最初處理查詢時,SQLite不會「提取」所有行。每當準備好的查詢分步時,它就返回一行。

從SQLite3的常見問題here

Q)哪個FUNC可以得到行數?

A)沒有函數來檢索結果集中的行數。 SQLite不提前知道這個數字,但是在遍歷這些表時逐行地返回。應用程序可以在每次成功的sqlite3_step()時根據需要增加一個行計數器。

一些包裝能夠收集內存表中結果集中的所有行,以便它們可以返回行數。

你總是可以得到某一個SELECT語句返回的一些性能爲代價的行數:

BEGIN IMMEDIATE TRANSACTION; 
SELECT COUNT(*) FROM x WHERE y; 
SELECT a,b,c FROM x WHERE y; 
ROLLBACK TRANSACTION; 

你必須在一個事務中來包裝是爲了防止從插入/刪除行的其他連接在兩個SELECT語句之間。

+0

感謝您的出色答案,這使得它更清晰地發生了什麼,並告訴我我應該做什麼。 – Andrew 2011-02-06 04:43:26

相關問題