习惯追踪应用添加习惯时报错:sqlite3.Connection对象无add属性
问题分析与解决
核心错误原因
报错AttributeError: 'sqlite3.Connection' object has no attribute 'add'的直接原因:
- 你在
habit.py里把self.database(这是sqlite3.Connection对象)当成带add方法的对象调用,但sqlite3.Connection本身没有这个方法。add是database.py里定义的独立函数,不是连接对象的成员方法。
另外database.py的add函数存在冗余问题:函数已接收db参数,内部却重新调用establish_connection创建新连接,导致传入的连接被忽略,属于不必要的重复操作。
具体修正步骤
1. 修正habit.py中的add_habit方法
先确保habit.py顶部导入database模块:
import database
然后修改add_habit的调用逻辑,直接调用database.add函数:
def add_habit(self): if habit_exists(self.database, self.name) is False: # 调用database模块的add函数,传入已创建的连接self.database database.add(self.database, self.name, self.description, self.duration, self.start_time, self.streak) print(f'{self.name} has been added to the database as a {self.duration} habit starting on {self.start_time}\n') else: print(f'{self.name} already exists in the database\n')
2. 修正database.py中的add函数
删除内部重复创建连接的代码,直接使用传入的db连接:
def add(db, name, description, duration, start_time, streak): """Adds a habit to the database Args: db (sqlite3.connect): _description_ name (str): _description_ description (str): _description_ duration (str): _description_ start_time (str): _description_ streak (int): _description_ """ # 移除该行重复创建连接的代码:db = establish_connection('main.db') cursor = db.cursor() cursor.execute('''INSERT INTO habits (name, description, duration, start_time, streak) VALUES (?, ?, ?, ?, ?)''', (name, description, duration, start_time, streak)) db.commit()
额外说明
- 复用数据库连接:既然已经在
habit类中创建了self.database连接,就应该复用它,避免重复创建连接带来的性能损耗和事务问题。 - 区分函数与方法:独立函数需通过模块名调用,对象方法才通过实例调用,不要混淆两种调用方式。
内容的提问来源于stack exchange,提问作者B.Copeland
相关产品推荐
相关产品推荐

