首页 文章

在Python中's sqlite3 module, why can' t cursor.rowcount()告诉我select语句返回的行数

提问于
浏览
2

所以我读了the documentation,它说:

Cursor.rowcount¶尽管sqlite3模块的Cursor类实现了这个属性,但数据库引擎自己支持确定“受影响的行”/“所选行”是很古怪的 . 这包括SELECT语句,因为在获取所有行之前,我们无法确定查询生成的行数 .

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

1 回答

  • 9

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

    来自SQLite3 FAQ here

    问)哪个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语句之间插入/删除行 .

相关问题