我想在我的Python3k程序中获得rowcount
sqlite3
的{{1}},但我很困惑,因为cursor
总是rowcount
尽管Python3文档说的是(实际上它是矛盾的,它应该是-1
)。即使在获取所有行后,None
也会停留在rowcount
。它是-1
错误吗?我已经检查过表中是否有行。
如果sqlite3
返回的内容与fetchone()
不同,我可以解决此问题,但我认为这个问题很适合讨论。
感谢。
答案 0 :(得分:20)
根据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