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

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
相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 08:15:43