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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 03:18:24