在我的 Flask 应用程序中,我有一个名为
Well
的模型类,其中包含一个名为 getProdDF
的函数,它从名为 ProductionData
的模型类中提取生产数据,并使用 pd.read_sql
将其转换为 pandas 数据框。在我的本地机器上,它像这样工作得很好:
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)
#etc
但是当我试图将代码移动到服务器并尝试在那里运行它时,它给了我这个错误:
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\ProjNameemphasized text\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'
非常感谢, 亚历克斯
折腾了一番,终于找到了问题所在。在我的本地机器上,我安装了 SQLAlchemy==1.4.29 和 Flask-SQLAlchemy==2.5.1,而在服务器上,我安装了 SQLAlchemy==1.4.46 和 Flask-SQLAlchemy==3.0.3。无论出于何种原因,这些软件包的新版本在我的网站上不起作用。
为了修复它,我首先在服务器上卸载了新版本:
>>> pip uninstall SQLAlchemy
>>> pip uninstall Flask-SQLAlchemy
然后通过在 pip 中指定版本来安装旧版本,如下所示:
>>> pip install SQLAlchemy==1.4.29
>>> pip install Flask-SQLAlchemy==2.5.1
这就解决了。
谢谢, 亚历克斯