Python SQLite查询类报错:AttributeError: 'str' object has no attribute 'cursor'
问题分析与解决
错误根源
你直接通过Database.select()这种类调用的方式执行方法,却没有先创建类的实例。这时候方法里的self参数会被第一个传入的字符串参数(SQL语句)填充,自然会触发'str' object has no attribute 'cursor'的报错——因为字符串本身根本没有cursor属性。
修复后的代码
先实例化Database类,再用实例调用select方法:
import sqlite3 class Database: def __init__(self): self.connection = sqlite3.connect('devel.db') self.cursor = self.connection.cursor() # 刚连接数据库无修改操作,这里的commit可以删除 # self.connection.commit() def query(self, query, params=()): # sqlite3原生支持空元组参数,无需额外判断 self.cursor.execute(query, params) self.connection.commit() return True def select(self, query, params=()): self.cursor.execute(query, params) return self.cursor.fetchall() id = 1 # 先创建类的实例 db = Database() # 通过实例调用select方法 result = db.select("SELECT * FROM users WHERE id = ?", (id,)) print(result)
额外优化建议
- 抽离重复执行逻辑,减少代码冗余:
def _execute(self, query, params=()): self.cursor.execute(query, params) def query(self, query, params=()): self._execute(query, params) self.connection.commit() return True def select(self, query, params=()): self._execute(query, params) return self.cursor.fetchall() - 添加资源清理逻辑,避免数据库连接泄漏(推荐上下文管理器方式):
def __enter__(self): return self def __exit__(self, exc_type, exc_val, exc_tb): self.cursor.close() self.connection.close()
使用方式
with Database() as db:
result = db.select("SELECT * FROM users WHERE id = ?", (id,))
内容的提问来源于stack exchange,提问作者Skyde
相关产品推荐
相关产品推荐

