Flask应用部署服务器后pd.read_sql读取SQLite数据库失败
问题:Flask部署后pd.read_sql调用出现AttributeError: 'NoneType' object has no attribute 'cursor'
问题背景
我开发的Flask应用中有一个Well模型类,其getProdDF方法从ProductionData模型获取生产数据,并通过pd.read_sql转换为pandas DataFrame。该功能在本地运行正常,但部署到服务器后调用方法时触发错误。
模型代码
class Well: id = db.Column(db.Integer, primary_key=True) production = db.relationship('ProductionData', backref='well', lazy='dynamic') def getProdDF(self): data = self.production df = pd.read_sql(data.statement, data.session.bind) class ProductionData(ProdData, db.Model): id = db.Column(db.Integer, primary_key=True) well_id = db.Column(db.Integer, db.ForeignKey('well.id')) oil = db.Column(db.Float) # 其他字段
报错信息
部署后调用getProdDF时出现以下错误:
File "C:\Users\usr\Code\ProjName\app\models.py", line 517, in getProdDF df = pd.read_sql(data.statement, data.session.bind) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\usr\Envs\ProjName\Lib\site-packages\pandas\io\sql.py", line 564, in read_sql return pandas_sql.read_query( ^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\usr\Envs\ProjName\Lib\site-packages\pandas\io\sql.py", line 2078, in read_query cursor = self.execute(*args) ^^^^^^^^^^^^^^^^^^^ File "C:\Users\usr\Envs\ProjName\Lib\site-packages\pandas\io\sql.py", line 2016, in execute cur = self.con.cursor() ^^^^^^^^^^^^^^^^^ AttributeError: 'NoneType' object has no attribute 'cursor'
排查情况
已将app.db数据库文件复制到服务器,命令行可正常连接并读取数据,但调用Well实例的getProdDF方法仍触发相同错误:
>>> from app import app, db >>> from app.models import Well >>> app.app_context().push() >>> w = Well.query.first() >>> w.getProdDF() Traceback (most recent call last): File "<stdin>", line 1, in <module> File "C:\Users\usr\Code\ProjName\app\models.py", line 517, in getProdDF df = pd.read_sql(data.statement, data.session.bind) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\usr\Envs\ProjName\Lib\site-packages\pandas\io\sql.py", line 564, in read_sql return pandas_sql.read_query( ^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\usr\Envs\ProjName\Lib\site-packages\pandas\io\sql.py", line 2078, in read_query cursor = self.execute(*args) ^^^^^^^^^^^^^^^^^^^ File "C:\Users\usr\Envs\ProjName\Lib\site-packages\pandas\io\sql.py", line 2016, in execute cur = self.con.cursor() ^^^^^^^^^^^^^^^ AttributeError: 'NoneType' object has no attribute 'cursor'
解决方案
问题根源是动态关系查询对象的session.bind在服务器环境中变为None,替换为全局数据库引擎或当前会话连接即可解决:
方案1:使用全局db.engine
修改getProdDF方法:
def getProdDF(self): data = self.production df = pd.read_sql(data.statement, db.engine)
方案2:显式获取当前会话连接
def getProdDF(self): data = self.production conn = db.session.connection() df = pd.read_sql(data.statement, conn)
原因说明
- 本地运行时模型实例的session绑定保持有效,但服务器环境(如WSGI服务器)的上下文切换可能导致动态查询对象的
session.bind丢失 db.engine是全局数据库引擎实例,始终指向正确的数据库配置,不会出现绑定丢失问题db.session.connection()可确保获取当前活跃上下文的有效数据库连接
内容的提问来源于stack exchange,提问作者Alex S
相关产品推荐
相关产品推荐

