在Python的sqlite3模块中,为什么cursor.rowcount()不能告诉我select语句返回的行数

And*_*rew 2 python sql sqlite

所以我已阅读文档,并说:

Cursor.rowcount

虽然sqlite3模块的Cursor类实现了这个属性,但数据库引擎自己支持确定"受影响的行"/"所选行"是很古怪的.

这包括SELECT语句,因为在获取所有行之前,我们无法确定查询生成的行数.

为什么在执行SELECT之后,我不能用它来确定返回的行数.当然,已经执行的查询现在已经获取了所有行?

Dou*_*rie 9

在最初处理查询时,SQLite不会"获取"所有行.每次执行准备好的查询时,它都返回一行.

这里的SQLite3常见问题解答

问)哪个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;
Run Code Online (Sandbox Code Playgroud)

您必须在事务中包装它以防止其他连接在两个SELECT语句之间插入/删除行.