Python数据库SQLite中的fetchone()、fetchMany()、fetchall()函数

本文记录了作者在使用Python进行数据库查询时,fetchone(), fetchmany(3), fetchall()方法的实际效果与理解误区,解释了游标的移动原理,并提供了正确调用方式以获取预期结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      今天在练习python数据库的查询操作时,使用fetchone()、fetchMany()、fetchall()函数,出现了一些奇怪的现象,现在做如下记录。

      我想在同一个代码块中,使用fetchone()查询一条信息,使用fetchmany(3)查询3条信息,fetchall()查询全部信息,查询的对应代码段如下:

#14.3   使用不同的方法查询用户信息
conn = sql.connect(r"D:\_spring\mirsoft.db")
cursor = conn.cursor()

cursor.execute('select * from user')

print("======fetchone()======")
result1 = cursor.fetchone()
print(result1)

print("======fetchmany()======")
result2 = cursor.fetchmany(3)
print(result2)

print("======fetchall()======")
result3 = cursor.fetchall()
print(result3)

cursor.close()
conn.commit()
conn.close()

      然而并没有想要的结果。

#理想的结果
======fetchone()======
(1, 'Menny')

======fetchmany(3)======
[(1, 'Menny'), (2, 'Liming'), (3, 'Jydius')]

======fetchall()======
[(1, 'Menny'), (2, 'Liming'), (3, 'Jydius'), (4, 'spring')]


#实际的结果
======fetchone()======
(1, 'Menny')

======fetchmany()======
[(2, 'Liming'), (3, 'Jydius'), (4, 'spring')]

======fetchall()======
[]

       原因:游标cursor如同C中文件的指针一样,每次都会移动到一定的位置,如果不指定它返回开头,那么就会沿着当前位置继续下一次的移动。所以,在以上代码中,fetchone得到的是第一个序号(1,“jenny”),紧接着的fetchmany(3)得到的是从第二个序号起的下面三个序号,即[(2, 'Liming'), (3, 'Jydius'), (4, 'spring')],再执行fetchall时,游标已经移动到了user表的末尾,没有记录可以查询,所以返回的是空值。

      修改代码如下:

#14.3   使用不同的方法查询用户信息
conn = sql.connect(r"D:\_spring\spring_Python\exp_14_option_database\mirsoft.db")
cursor = conn.cursor()

cursor.execute('select * from user')

print("======fetchone()======")
result1 = cursor.fetchone()
print(result1)

print("\n======fetchmany(3)======")
cursor.execute('select * from user')    #每一次都让游标返回user表的开头
result2 = cursor.fetchmany(3)
print(result2)

print("\n======fetchall()======")
cursor.execute('select * from user')    #每一次都让游标返回user表的开头
result3 = cursor.fetchall()
print(result3)

cursor.close()
conn.commit()
conn.close()

      得到如下结果:

======fetchone()======
(1, 'Menny')

======fetchmany(3)======
[(1, 'Menny'), (2, 'Liming'), (3, 'Jydius')]

======fetchall()======
[(1, 'Menny'), (2, 'Liming'), (3, 'Jydius'), (4, 'spring')]

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值