启动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_
相关产品推荐
相关产品推荐

