python Flask项目使用SQLalchemy连接数据库时,出现RuntimeError:Working outside of application context.的解决过程记录

这篇具有很好参考价值的文章主要介绍了python Flask项目使用SQLalchemy连接数据库时,出现RuntimeError:Working outside of application context.的解决过程记录。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、问题出现

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

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

app = Flask(__name__, static_url_path='/')

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

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

from main import db # 直接引用main模块中的全局变量
    
class Users(db.Model):
    __table__ = Table('users', db.metadata, autoload_with=db.engine, mysql_bind=db.engine)

    def find_user_by_id(self, userid):
        row = db.session.query(Users).filter(Users.userid == userid).first()
        return row

    def find_user_by_id2(self, userid):
        row = Users.query.filter(Users.userid == userid).first()
        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

from main import db,app # 直接引用main模块中的全局变量
# 创建上下文
with app.app_context():

    class Users(db.Model):
    __table__ = Table('users', db.metadata, autoload_with=db.engine, mysql_bind=db.engine)

    def find_user_by_id(self, userid):
        row = db.session.query(Users).filter(Users.userid == userid).first()
        return row

    def find_user_by_id2(self, userid):
        row = Users.query.filter(Users.userid == userid).first()
        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 实例,代码如下:
    from flask_sqlalchemy import SQLAlchemy
    
    db = SQLAlchemy()
    
  2. 在主程序 main.py 中导入 db 对象并绑定到 Flask 应用程序实例:
    from flask import Flask
    from database import db
    
    app = Flask(__name__)
    app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:password@localhost:3306/ayangnote?charset=utf8'
    app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
    db.init_app(app)
    
  3. 在其他模块中导入 db 对象,并确保它们使用的是相同的 Flask 应用程序实例。例如,在 module.py 中:
    from database import db
    
    with app.app_context():
        class Users(db.Model):
            ...
    

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

最后鸣谢chatgpt,呜呜文章来源地址https://www.toymoban.com/news/detail-488119.html

到了这里,关于python Flask项目使用SQLalchemy连接数据库时,出现RuntimeError:Working outside of application context.的解决过程记录的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【python】flask操作数据库工具SQLAlchemy,详细用法和应用实战

    ✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,

    2024年04月17日
    浏览(53)
  • Flask-数据库-SQLAlchemy

    SQLAlchemy是flask的扩展,是一个功能强大的OR映射器,支持多种数据库后台,可以将类的对象映射至数据库表。 使用这个工具,可以创建数据库,创建表,并为数据库添加数据,进行查询操作等。 参考:Flask SQLAlchemy - Flask 教程 | BootWiki.com  app=Flask(__name__)  #创建Flask实例  app

    2023年04月09日
    浏览(41)
  • Flask数据库操作-Flask-SQLAlchemy

    Flask中一般使用flask-sqlalchemy来操作数据库。flask-sqlalchemy的使用介绍如下: 一、SQLAlchemy SQLALchemy 实际上是对数据库的抽象,让开发者不用直接和 SQL 语句打交道,而是通过 Python 对象来操作数据库,在舍弃一些性能开销的同时,换来的是开发效率的较大提升。 SQLAlchemy是一个关

    2024年02月22日
    浏览(56)
  • Flask数据库之SQLAlchemy--介绍--链接数据库

    目录 SQLAlchemy介绍 SQLAlchemy连接数据库  数据库是一个网站的基础!!! 比如MySQL、MongoDB、SQLite、PostgreSQL等,这里我们以MySQL为例进行讲解。 SQLAlchemy是一个ORM框架 对象关系映射 (英语: Object Relational Mapping ,简称 ORM ,或 O/RM ,或 O/R mapping ),是一种程序设计技术,用于实

    2024年02月07日
    浏览(61)
  • Flask-sqlalchemy更新数据库

    Flask开发过程中,难免不会在开发工程中修改数据库信息,如添加字段,修改字段类型等,Flask可以通过扩展库flask-migrate来更新DEBUG中的工程数据库,更新数据库步骤如下: 1、首先需要安装flask_migrate,pip install flask_migrate 2、因为flask_sqlalchemy是通过终端命令更新,所以需要f

    2023年04月08日
    浏览(40)
  • flask中的操作数据库的插件Flask-SQLAlchemy

    Web 开发中,一个重要的组成部分便是数据库了。Web 程序中最常用的莫过于关系型数据库了,也称 SQL 数据库。另外,文档数据库(如 mongodb)、键值对数据库(如 redis)近几年也逐渐在 web 开发中流行起来,我们习惯把这两种数据库称为 NoSQL 数据库。 大多数的关系型数据库引

    2024年02月09日
    浏览(60)
  • Python 进阶(三):Python使用ORM框架SQLAlchemy操作Oracle数据库

    要详细连接Oracle数据库并使用SQLAlchemy进行操作,按照以下步骤进行配置和编写代码: Oracle Instant Client:Oracle 提供的客户端库,可用于在 Python 中连接和操作 Oracle 数据库 访问 Oracle 官方网站:前往 Oracle 官方网站(instant-client/winx64-64-downloads) 可能需要创建一个免费的 Oracle

    2024年02月11日
    浏览(48)
  • 【Flask 连接数据库,使用Flask-Migrate实现数据库迁移及问题汇总】

    Flask 连接数据库,使用Flask-Migrate实现数据库迁移 安装Flask-Migrate插件 使用Flask-Migrate步骤 app.py主要用于数据库连接 model.py 中导入了 db,作用是存储一个User类 ,用于生成表头。 manager.py用于数据迁移管理,运行后将生成一个文件夹。 Flask-Migrate运行 问题汇总 问题一:flask_mig

    2024年01月16日
    浏览(48)
  • 将网页数据读入数据库+将数据库数据读出到网页——基于python flask实现网页与数据库的交互连接【全网最全】

    【全网最全!保姆级教学!!】 本篇博客基于flask技术,实现数据库和网页端的交互。 实现效果:在网页端输入数据,能够将数据存入数据库。反向操作时,能将数据库的数据取出,显示在网页端。不仅如此,还支持数据的查询和修改。  读取网页数据存入数据库,效果如下

    2024年02月13日
    浏览(47)
  • 【fly-iot飞凡物联】(15):IOT项目使用TDengine数据库,进行技术调研,本地使用docker启动成功,可以使用python进行连接数据插入。

    本文的原文连接是: https://blog.csdn.net/freewebsys/article/details/108971807 fly-iot飞凡物联专栏: https://blog.csdn.net/freewebsys/category_12219758.html 产品简介 TDengine 是一款专为物联网、工业互联网等场景设计并优化的大数据平台,它能安全高效地将大量设备、数据采集器每天产生的高达 TB 甚至

    2024年02月03日
    浏览(67)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包