You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 03:24:28