python SQLite3 fetchall实际上并不是fetchall

a11xaf1n  于 12个月前  发布在  Python
关注(0)|答案(1)|浏览(111)

我创建了一个简单的4行表,并填充了数据。当我在解释器中检查表时,所有数据都存在且正确。当我在Python代码中运行fetchall()时,我只得到2行。怎么了?
下面是表(portSettings):

portName  portPrefix  portOption  portDeadband
--------  ----------  ----------  ------------
mInput1   min1_       1           0.1
mInput2   min2_       1           0.1
mInput3   min3_       1           0.1
mInput4   min4_       1           0.1

代码如下:

db = sqlite3.connect(dbLocation)
ptr = db.cursor()

query = 'SELECT * FROM portSettings;'
ptr.execute(query)
results = ptr.fetchall()
print(f'--------> {ptr.rowcount} results.  voila! ↓ --------')
print(results)

结果是这样的

--------> -1 results.  voila! ↓ --------
[('mInput3', 'min3_', 1, 0.1), ('mInput4', 'min4_', 1, 0.1)]

所以最重要的是剩下的数据呢第二,为什么ptr.rowcount()是-1??

lpwwtiir

lpwwtiir1#

您的示例只打印最后两行--在我的测试中,我得到了所有四行:

$ ls -al | grep foo
-rw-r--r--   1 user  staff    8192 Oct 13 14:37 foo.db
-rw-r--r--   1 user  staff     252 Oct 13 14:38 foo.py

$ cat foo.py 
import sqlite3

dbLocation = 'foo.db'
db = sqlite3.connect(dbLocation)
ptr = db.cursor()

query = 'SELECT * FROM portSettings;'
ptr.execute(query)
results = ptr.fetchall()
print(f'--------> {ptr.rowcount} results.  voila! ↓ --------')
print(results)

$ python3.11 foo.py 
--------> -1 results.  voila! ↓ --------
[('mInput1', 'min1_', 1, 0.1), ('mInput2', 'min2_', 1, 0.1), ('mInput3', 'min3_', 1, 0.1), ('mInput4', 'min4_', 1, 0.1)]

由于你只看到最后两行,我只能想到几种可能性:
1.如果您打开了sqlite3解释器,则可能存在未提交的事务
1.根据dbLocation的值,您的python应用程序和sqlite3解释器可能打开了不同的.db文件
ptr.rowcount行为已记录。要更改计数,可以使用len(results)

$ cat foo.py  | grep len
print(f'--------> {len(results)} results.  voila! ↓ --------')

$ python3.11 foo.py 
--------> 4 results.  voila! ↓ --------
[('mInput1', 'min1_', 1, 0.1), ('mInput2', 'min2_', 1, 0.1), ('mInput3', 'min3_', 1, 0.1), ('mInput4', 'min4_', 1, 0.1)]

修复这个ptr.rowcount可能会有帮助,也许这可以帮助你找到一些线索,为什么你只看到2行?

相关问题