当前位置:   article > 正文

python Flask项目使用SQLalchemy连接数据库时,出现RuntimeError:Working outside of application context.的解决过程记录_runtimeerror: the current flask app is not registe

runtimeerror: the current flask app is not registered with this 'sqlalchemy

一、问题出现

在使用python的Flask框架跟着教程编写项目时,我跟着教程使用了三个文件来组织,分别是main.py(主程序),module.py(数据库模型),controller.py(蓝图模块程序,用Blueprint衔接)

在主程序中,创建app、SQLalchemy实例对象db并将二者绑定

  1. app = Flask(__name__, static_url_path='/')
  2. # 配置app参数
  3. app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:password@localhost:3306/ayangnote?charset=utf8'
  4. app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False # True跟踪数据库的修改,及时发送信号
  5. # 实例化db对象,绑定flask的app
  6. db = SQLalchemy(app)

在module.py中,导入主程序中的db和app,创建子类Users作为查询表,并定义数据库查询的方法

  1. from main import db # 直接引用main模块中的全局变量
  2. class Users(db.Model):
  3. __table__ = Table('users', db.metadata, autoload_with=db.engine, mysql_bind=db.engine)
  4. def find_user_by_id(self, userid):
  5. row = db.session.query(Users).filter(Users.userid == userid).first()
  6. return row
  7. def find_user_by_id2(self, userid):
  8. row = Users.query.filter(Users.userid == userid).first()
  9. return row

controller.py与主程序通过Blueprint衔接,并且创建查询接口和指定操作

但我写完后,运行起来报错RuntimeError: Working outside of application context.表示缺少上下文

二、试图修改

在查询相关解决方案后,我试图理解了一下Flask框架上下文机制的原理,增加代码with app.app_context():

参考链接:关于flask中 RuntimeError: Working outside of application context 引发的问题(flask中的上下文机制)

module修改1.py

  1. from main import db,app # 直接引用main模块中的全局变量
  2. # 创建上下文
  3. with app.app_context():
  4. class Users(db.Model):
  5. __table__ = Table('users', db.metadata, autoload_with=db.engine, mysql_bind=db.engine)
  6. def find_user_by_id(self, userid):
  7. row = db.session.query(Users).filter(Users.userid == userid).first()
  8. return row
  9. def find_user_by_id2(self, userid):
  10. row = Users.query.filter(Users.userid == userid).first()
  11. return row

这样修改完,仍然在页面报错RuntimeError: The current Flask app is not registered with this 'SQLAlchemy' instance. Did you forget to call 'init_app', or did you create multiple 'SQLAlchemy' instances?

三、解决方案

我意识到是两个文件中应用的SQLAlchemy对象可能并非同一个(现在仍然不知道为啥,如有人知道求告知!)最终在chatgpt的帮助下得出一个比较笨,但很简单的解决方案:

解决方案如下:

具体来说,SQLAlchemy 对象需要知道它将要与哪个 Flask 应用程序实例绑定。如果在不同的 Python 文件中创建了不同的 Flask 实例,并且在每个文件中都创建了一个 SQLAlchemy 实例,则会导致这个问题。为了解决这个问题,你可以考虑将 SQLAlchemy 实例单独放在一个模块中,然后在需要使用它的地方导入它。同时,在 main.py 中导入其他模块时,也要确保它们使用的是相同的 Flask 实例。

以下是一个可能的解决方案:

  1. 在一个单独的文件(例如 database.py)中创建一个 SQLAlchemy 实例,代码如下:
    1. from flask_sqlalchemy import SQLAlchemy
    2. db = SQLAlchemy()

  2. 在主程序 main.py 中导入 db 对象并绑定到 Flask 应用程序实例:
    1. from flask import Flask
    2. from database import db
    3. app = Flask(__name__)
    4. app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:password@localhost:3306/ayangnote?charset=utf8'
    5. app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
    6. db.init_app(app)

  3. 在其他模块中导入 db 对象,并确保它们使用的是相同的 Flask 应用程序实例。例如,在 module.py 中:
    1. from database import db
    2. with app.app_context():
    3. class Users(db.Model):
    4. ...

    这样,所有模块都将使用相同的 Flask 应用程序实例和 SQLAlchemy 实例,从而避免出现不同实例之间的冲突。

最后鸣谢chatgpt,呜呜

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号