Flask使用SimpleConnectionPool管理psycopg2连接出现对象不可下标错误问询
报错原因
该报错的核心是你尝试对Flask类的实例对象使用字典下标语法[]取值,但Flask实例本身没有实现__getitem__方法,不支持这种操作。结合你给出的代码,有两种常见触发场景:
- 你贴出的放回连接的代码存在笔误,误将
current_app.config['pool']写成了current_app['pool'],直接对current_app(也就是Flask实例)用[]取值,触发报错 - 你执行放回连接代码的位置没有处于Flask激活的应用上下文内,导致
current_app指向异常,出现非预期的类型报错
解决方案
- 首先核对放回连接的代码语法,确保是通过
config属性读取配置,正确写法如下:
from flask import current_app # 假设connection是你之前从连接池取出的连接对象 cursor = connection.cursor() cursor.execute(self.query) connection.commit() # 确认路径是current_app.config['pool'],不要省略config current_app.config['pool'].putconn(connection)
- 如果确认语法没有问题,检查代码执行上下文:如果是在请求上下文之外执行(比如离线脚本、异步任务中),需要手动推入应用上下文后再执行相关操作,示例代码:
from your_app_package import app # 导入你初始化的Flask实例 with app.app_context(): # 把数据库操作代码放在上下文管理器内部 connection = get_db() cursor = connection.cursor() cursor.execute(self.query) connection.commit() current_app.config['pool'].putconn(connection)
- 额外优化建议:可以封装统一的释放连接函数,避免每次手写出现语法错误,示例:
from flask import current_app def release_db(connection): if connection: current_app.config['pool'].putconn(connection)
内容的提问来源于stack exchange,提问作者Mark Kewton
相关产品推荐
相关产品推荐

