Python SQLite3 判断游标结果是否为空的正确方法
本文介绍在Python中使用SQLite3时,如何准确判断游标(cursor)查询结果是否为空。通过示例展示利用len(list(cursor))判断空值的方法,并深入解析游标的工作原理、状态特性及常用操作方法如fetchall和fetchone,帮助开发者避免常见错误。
判断Python SQLite3游标结果是否为空的常用方法是:将游标转换为列表后检查其长度,若长度为0则表示结果为空。
以下通过具体代码示例进行说明:
import sqlite3
# CREATE
db = sqlite3.connect("E:/Pycharm/workspace/django_test/user.db")
db.execute("create table user(info primary key,flag,result )")
db.execute("insert into user(info,flag,result) values('RikkaTakanashi','0','DarkFlameMaster')")
db.commit()
db.close()
db = sqlite3.connect("E:/Pycharm/workspace/django_test/user.db")
c=db.cursor()
cursor=c.execute("select info,flag,result from user where info='123'")
print(len(list(cursor)))
当查询条件不匹配任何记录时,上述方法返回0,表示结果为空。
db = sqlite3.connect("E:/Pycharm/workspace/django_test/user.db")
c=db.cursor()
cursor=c.execute("select info,flag,result from user where info='RikkaTakanashi'")
print(len(list(cursor)))
当查询条件匹配到记录时,上述方法返回1(或更多),表示结果非空。
补充知识:Python中SQLite游标(cursor)的基本概念
关系数据库管理系统本质上是面向集合的,在SQLite中,除非使用where子句限制只选中一条记录,否则没有直接描述表中单一记录的形式。因此,必须借助游标来进行面向单条记录的数据处理。游标允许应用程序对select语句返回的行结果集中的每一行执行相同或不同的操作,而不是一次性对整个结果集执行同一种操作。此外,游标还提供基于游标位置对表中数据进行删除或更新的能力。游标将面向集合的数据库管理系统与面向行的程序设计联系起来,使两种数据处理方式能够进行沟通。
游标为从表中检索出的数据提供了灵活的操作手段。本质上,游标是一种能从包含多条数据记录的结果集中每次提取一条记录的机制。游标总是与一条SQL选择语句相关联,因为它由结果集(可以是零条、一条或由相关选择语句检索出的多条记录)和结果集中指向特定记录的游标位置组成。当决定对结果集进行处理时,必须声明一个指向该结果集的游标。如果曾用C语言编写过处理文件的程序,游标就像打开文件所得到的文件句柄一样,只要文件打开成功,该文件句柄就代表该文件。对于游标而言,道理相同。可见,游标能够实现按与传统程序读取平面文件类似的方式处理来自基础表的结果集,从而把表中数据以平面文件的形式呈现给程序。
使用Python的SQLite时,只要搞清楚Connection和Cursor对象,打开后一定记得关闭,就可以放心地使用。
使用Cursor对象执行insert、update、delete语句时,执行结果由rowcount返回影响的行数,就可以拿到执行结果。
使用Cursor对象执行select语句时,通过fetchall()返回select的全部数据结果集。结果集是一个list,每个元素都是一个tuple,对应一行记录,按建表的字段顺序排列。fetchone()返回一条结果,是一个tuple,每个元素是一个字段值。
需要注意的是,SQLite游标是有状态的,只能遍历结果集一次,不能在结果集中返回移动,遍历结束返回空值。fetchall()一次性返回全部结果,fetchone()依顺序每次返回一条结果,而且对fetchone()执行len()操作以获得所取得记录的条数后,相当于完成对结果集的一次遍历,结果集将被清空。因此,取得结果集后,如需对结果集进行进一步操作,可将结果集保存到变量中。
while cn.fetchone():
print(cn.fetchone())
for line in cn.featchall():
print(line)
以上为个人经验,希望能给大家一个参考,也希望大家多多支持本站。如有错误或未考虑完全的地方,望不吝赐教。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









