Python数据库操作:fetchone与fetchall区别及空值处理详解
本文详细解析Python中数据库查询方法fetchone与fetchall的核心区别。fetchone始终返回单条数据的元组,而fetchall返回包含所有结果元组的列表。文章通过代码示例说明如何正确提取数据,并重点强调在获取结果前必须进行非空判断,以避免因空值导致的索引越界异常,提供实用的避坑建议。
在Python中进行数据库查询时,开发者常对使用fetchone还是fetchall感到困惑。若未明确两者差异及适用场景,极易引发程序报错。理解其本质区别是避免此类问题的关键。
fetchone与fetchall区别
本文基于Python3环境进行说明。
fetchone
无论查询结果包含单条还是多条数据,调用fetchone方法返回的始终是一个元组(tuple)。
当查询结果仅包含一条数据时,fetchone返回该条数据构成的单个元组。
当查询结果包含多条数据时,fetchone默认仅返回结果集中的第一条数据,并以元组形式呈现。
因此,若需获取元组中的具体数值,应通过索引访问,例如使用cur.fetchone()[0]。
fetchall
无论查询结果包含单条还是多条数据,调用fetchall方法返回的始终是一个由元组组成的列表(list)。
当查询结果仅包含一条数据时,fetchall返回一个包含单个元组的列表,即列表内有一个元组元素。
当查询结果包含多条数据时,fetchall返回一个包含多个元组的列表。
因此,若需获取具体数值,需通过双重索引访问,例如使用cur.fetchall()[0][0]。
使用场景
通常情况下,若预期查询结果集仅包含单条数据,推荐使用fetchone获取数据。
通常情况下,若预期查询结果集包含多条数据,推荐使用fetchall获取数据。
简单实例
import cx_Oracle
conn = cx_Oracle.connect("用户名/密码@数据库地址")
cur = conn.cursor()
sql_3 = "select id from CZEPT_BSDT t WHERE name='{}'".format("基本支出调剂")
cur.execute(sql_3)
result_3 = cur.fetchone() # 单条数据结果集
print(result_3) # (1,)
print(type(result_3)) # <class 'tuple'>
result_3= result_3[0]
print(result_3) # 1
print(type(result_3)) # <class 'int'>
print("*" * 50)
sql_2 = "select * from CZEPT_BSDT "
cur.execute(sql_2)
result_2 = cur.fetchall() # 多条数据结果集
print(result_2) # [(1,'基本支出调剂'),(3,'银行账户审批'),(5,'项目支出调剂')]
print(type(result_2)) # <class 'list'>
result_2= result_2[0][0]
print(result_2) # 1
print(type(result_2)) # <class 'int'>
注意事项
在使用fetchone或fetchall获取结果后,务必先判断结果是否非空。若存在空值情况且未做判断直接尝试获取元组内数据,将触发“索引越界”异常。这是实践中多次遇到的常见错误。
import cx_Oracle
connection = cx_Oracle.connect('用户名/密码@数据库地址')
cur = connection.cursor()
for j in data_list:
sql = "select guid from jczl.division where name='{}'".format(j['DIVISIONNAME'])
cur.execute(sql)
result = cur.fetchone()
# 因为存在归口处室为空,所以切片的时候总是报超出索引范围,搞了好久
if result is not None:
j['DIVISIONGUID'] = str(result[0])
补充:Python DB.fetchall()用于获取数据库所有记录列表。
查询到的数据格式表现为列表结构。
当存在多条记录时,表现为包含多个元素的列表。

当仅有一条记录时,表现为包含单个元素的列表。

以上为个人经验分享,旨在提供参考。如有错误或未考虑周全之处,欢迎指正。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













