cursor.rowcount在python3k中的sqlite3中始终为-1

时间:2009-05-08 09:49:27

标签: python database sqlite

我想在我的Python3k程序中获得rowcount sqlite3的{​​{1}},但我很困惑,因为cursor总是rowcount尽管Python3文档说的是(实际上它是矛盾的,它应该是-1)。即使在获取所有行后,None也会停留在rowcount。它是-1错误吗?我已经检查过表中是否有行。

如果sqlite3返回的内容与fetchone()不同,我可以解决此问题,但我认为这个问题很适合讨论。

感谢。

6 个答案:

答案 0 :(得分:20)

来自documentation

  

根据Python DB API规范的要求,   rowcount属性“为-1以防万一   没有执行executeXX()   光标或最后一个的行数   操作无法确定   接口”。

     

这包括SELECT条款   因为我们无法确定数量   查询生成的行直到所有   已提取行。

这意味着所有 SELECT语句不会有rowcount 。记录您正在观察的行为。

编辑:在rowcount执行fetchall()之后,文档没有说明{{1}} 会更新,因此假设是错误的这一点。

答案 1 :(得分:14)

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

fetchall()将返回select返回的行列表。该列表的Len将为您提供行数。

答案 2 :(得分:8)

我建议:

,而不是“检查fetchone()是否返回不同于None的内容”
cursor.execute('SELECT * FROM foobar')
for row in cursor:
   ...

这只是sqlite - 仅在其他数据库API实现中不受支持,但对于sqlite非常方便 - 特定的Python代码(完整记录,请参阅{{3 }})。

答案 3 :(得分:7)

最好以这种方式计算行数:

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

答案 4 :(得分:1)

我花了很长时间试图找到这个,如果你使用这条线,你会想要使用 template<OneByteData T, std::size_t N> void append(std::span<T,N> const& sp) { // Do something } template <typename Cont> MyString& operator += (Cont const& cont) requires OneByteData<typename decltype(std::span{cont})::element_type> { this->append(std::span{cont}); return *this; } 它应该适合你。我用它来检查我的语句是否会返回任何数据。

.rowcount

答案 5 :(得分:-2)

使用PYCharm,在调试模式下,如果将光标放在光标变量上,会出现一个小+,当你点击它时,你会看到你对象的不同属性。

在我的1个元素的光标中,我看到:

rowcount={int}
arraysize={int}1

因此,在您的代码中,只需使用:

print(cursor.arraysize)
1