Python自定义sqlite类调用游标时出现AttributeError报错
问题根因
报错核心是未实例化Database类,直接通过类调用实例方法:
- 你定义的
query是类的实例方法,正常通过类实例调用时,Python会自动把实例对象绑定到方法的第一个参数self上 - 你直接用
Database.query(sql, "ABC")调用时,没有传入实例对象,第一个位置参数sql(字符串类型的SQL语句)会被赋值给self参数,第二个参数"ABC"会被赋值给方法定义里的query形参 - 方法内部执行
self.cur时,self实际是字符串对象,字符串不存在cur属性,因此抛出AttributeError: 'str' object has no attribute 'cur'
另外你的代码还存在一个隐藏bug:query方法每次执行完SQL就直接关闭数据库连接,就算调用方式正确,第二次调用query时会因为连接已关闭抛出错误。
修正方案
1. 调整类代码,修复连接关闭逻辑
import sqlite3 class Database: def __init__(self): self.file = 'database.db' self.conn = sqlite3.connect(self.file) self.cur = self.conn.cursor() def query(self, query, *args): try: self.cur.execute(query, args) self.conn.commit() except sqlite3.Error as e: print(e) # 新增单独的连接关闭方法,所有操作完成后再调用 def close(self): self.conn.close()
2. 调整调用逻辑,先实例化再调用方法
# 先创建Database类的实例 db = Database() sql = 'INSERT INTO table (name) VALUES (?);' # 通过实例调用query方法 db.query(sql, "ABC") # 所有数据库操作执行完毕后,再关闭连接 db.close()
补充说明
- 实例方法必须通过类实例调用,才会自动完成
self参数的绑定;如果强行通过类名调用实例方法,需要手动把实例作为第一个参数传入,不推荐这种写法 - 数据库连接无需每次执行SQL就关闭,频繁开关连接会产生不必要的性能开销,也会导致后续SQL执行失败,建议在全部数据库操作完成后统一关闭连接。
内容的提问来源于stack exchange,提问作者Ahmed Gokcel
相关产品推荐
相关产品推荐

