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

启动Bottle程序遇AttributeError:'str'对象无'cursor'属性求解决

解决Bottle程序中的AttributeError: 'str' object has no attribute 'cursor'

你遇到的问题根源其实很清晰:传给positions_list函数的db参数是个字符串(比如数据库文件名),但你需要的是bottle-sqlite插件提供的数据库连接对象。字符串本身没有cursor()方法,自然会抛出这个错误。

下面是具体的修复步骤和正确用法:

1. 先正确初始化bottle-sqlite插件

首先要确保你已经安装并正确配置了bottle-sqlite,它会自动帮你管理数据库连接,并把连接对象注入到路由函数中:

from bottle import Bottle, run
from bottle_sqlite import SQLitePlugin

app = Bottle()
# 安装插件,传入你的数据库文件路径(比如'jobs.db')
app.install(SQLitePlugin(dbfile='your_database_file.db'))

2. 让路由函数接收注入的连接对象

在你的路由函数里,需要声明db参数,bottle-sqlite会自动把可用的数据库连接对象传给它,再把这个对象传给你的positions_list函数:

@app.route('/positions')
def show_positions(db):  # 这里的db是连接对象,不是字符串!
    positions = positions_list(db, limit=10)
    # 这里可以添加渲染模板或返回JSON的逻辑
    return positions

def positions_list(db, limit=10):
    cur = db.cursor()
    # 重点:用参数化查询代替字符串拼接,避免SQL注入风险!
    sql = """
        SELECT id, timestamp, owner, title, location, company, description 
        FROM positions 
        ORDER BY TIMESTAMP DESC 
        LIMIT ?
    """
    # 把limit作为参数传入execute,而不是拼进SQL字符串
    cur.execute(sql, (limit,))
    # 获取查询结果并返回
    return cur.fetchall()

3. 为什么之前会出错?

你之前的代码应该是直接把数据库文件名(字符串)传给了positions_list,比如positions_list('my_db.db'),但bottle-sqlite的设计是通过插件统一管理连接,不需要手动传递文件名。插件会帮你处理连接的打开、关闭,以及线程安全的问题。

另外补充一个关键的最佳实践:绝对不要用字符串拼接构造SQL语句,这会带来严重的SQL注入风险。上面的代码用?作为占位符,把参数传给execute方法,才是安全的写法。

内容的提问来源于stack exchange,提问作者nrdsss_

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:28:46