Python中Employee类调用SQLite3查询返回Cursor对象的解决方法
解决sqlite3查询返回游标对象而非字段值的问题
这问题我太熟悉了!你现在拿到的<sqlite3.Cursor object...>是执行SQL后的游标对象,它只是承载查询结果的容器,不是实际的字段值。要拿到真实数据,得调用游标上的方法去提取结果。
核心问题分析
cur.execute()方法的作用是执行SQL语句,它返回的是游标本身,而不是查询出的数据。你需要用游标提供的fetchone()、fetchall()这类方法来获取实际结果:
fetchone():返回查询结果的第一行,适合你这种按唯一empid查询单条记录的场景fetchall():返回所有结果行的列表
修复后的代码(同时优化安全性)
另外,你用字符串拼接SQL的方式有SQL注入风险,强烈建议用参数化查询。还有,数据库连接用完要记得关闭,最好用with语句自动管理连接生命周期:
import sqlite3 class Employee: def __init__(self, empid): self.empid = empid # 用with语句自动管理连接和游标,无需手动关闭 with sqlite3.connect("employee.db") as conn: cur = conn.cursor() # 参数化查询,避免SQL注入 cur.execute("SELECT name, bday FROM employees WHERE empid = ?", (empid,)) # 提取单条记录的结果 result = cur.fetchone() if result: self.name, self.bday = result else: # 处理找不到对应员工的情况 self.name = None self.bday = None # 测试示例 emp = Employee(1) print(emp.name) print(emp.bday)
关键优化点
- 参数化查询:用
?作为占位符,把参数放在元组里传给execute,彻底避免SQL注入 - 自动管理连接:
with块结束后会自动提交事务并关闭连接,不用手动写conn.close() - 结果判断:加入
if result判断,防止找不到员工时出现Unpacking None的错误 - 单次查询:把name和bday的查询合并成一次SQL,减少数据库交互次数,提升效率
内容的提问来源于stack exchange,提问作者DJDiaper
相关产品推荐
相关产品推荐

