flask-sqlalchemy结合Blueprint遇到循环引入问题的解决方案

这篇具有很好参考价值的文章主要介绍了flask-sqlalchemy结合Blueprint遇到循环引入问题的解决方案。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

想要用flask_sqlalchemy结合Blueprint分模块写一下SQL的增删改查接口,结果发现有循环引入问题。

一开始,我在app.py中使用db = SQLAlchemy(app)创建数据库对象;并且使用app.register_blueprint(db_bp, url_prefix='/db')注册蓝图。

这使得我的依赖关系是这样的。db.py → app,py 中的db对象;app.py → db,py 用于注册蓝图,产生了循环引用。

接着我学着使用一个model.py来存放db变量,但是使用错误,下面是错误的示例。

我在model.py使用db = SQLAlchemy()创建了未注册的db对象

在app.py中使用db.init_app(app)来连接数据库,注册db对象

但在db.py中错误引用了app.py中的db对象,再次产生了循环引用

解决方法,在db.py中引入model.py中的db对象即可。

此时的依赖关系如下,db.py和app.py → model.py 用于获取db对象;app.py → db.py 用于注册蓝图。

 

看到一些比较麻烦的解决方案,1. 把db变量变成一个web接口,用请求的方式获取。

2. 把app注册db和blueprint的操作都放入main函数中。或者,先封装到def create_app()函数中,然后在main函数中调用。

参考 使用Flask-SQLAlchemy和Blueprints循环导入db引用 | 那些遇到过的问题

 

dao.py

from flask import Blueprint, request, jsonify
from models import db
from models import KnowledgeEntity
from sqlalchemy.exc import SQLAlchemyError


# 创建视图函数蓝图
app = Blueprint('KnowledgeDAO', __name__)

'''
word = db.Column(db.String(255), primary_key=True)
content = db.Column(db.Text, unique=True, nullable=False)
priority = db.Column(db.String(255), unique=True, nullable=False)
association = db.Column(db.JSON, unique=True, nullable=False)
'''


# 创建用户
@app.route('/add', methods=['POST'])
def create_user():
    data = request.get_json()
    word = data.get('word')
    content = data.get('content')
    priority = data.get('priority')
    association = data.get('association')

    if not word or not priority:
        return jsonify({'message': 'Both word and priority are required'}), 400

    entity = KnowledgeEntity(word=word, content=content, priority=priority, association=association)

    try:
        db.session.add(entity)
        db.session.commit()
        return jsonify(1), 201
    except SQLAlchemyError as e:
        db.session.rollback()  # 回滚事务以撤销之前的操作
        error_message = str(e)
        return f'Error: {error_message}', 500


# 查询所有用户
@app.route('/selectAll', methods=['POST'])
def get_users():


    users = KnowledgeEntity.query.all()
    print('users',users)
    # user_list = [{'id': user.id, 'username': user.username, 'email': user.email} for user in users]
    return jsonify(1)

 model.py

from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

class KnowledgeEntity(db.Model):
    __tablename__ = 'knowledge'
    word = db.Column(db.String(255), primary_key=True)
    content = db.Column(db.Text, unique=True, nullable=False)
    priority = db.Column(db.String(255), unique=True, nullable=False)
    association = db.Column(db.JSON, unique=True, nullable=False)

    def __init__(self, word, content=None, priority=None, association=None):
        self.word = word
        self.content = content
        self.priority = priority
        self.association = association

 app.py(改进后的)文章来源地址https://www.toymoban.com/news/detail-729289.html

from flask import Flask, request, jsonify,g
from flask_cors import CORS
from flask_sqlalchemy import SQLAlchemy
from models import db
# 导入视图函数
from DAO import KnowledgeDAO

app = Flask(__name__)
# 配置选项,用于控制 Flask 在将 Python 字典转换为 JSON 数据时是否按照键的字母顺序对键进行排序,默认情况下,它的值为 True,表示会对键进行排序。
app.config['JSON_SORT_KEYS'] = False
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:123456@127.0.0.1:3306/ennote'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

# 注册跨域
CORS(app, resources=r'/*')  # 注册CORS, "/*" 允许访问所有api

# 连接数据库
db.init_app(app)

# 注册蓝图
app.register_blueprint(KnowledgeDAO.app, url_prefix='/knowledge')

if __name__ == '__main__':


    # 创建应用上下文
    with app.app_context():
        # 在这里执行需要应用上下文的操作
        # 例如,访问数据库或使用Flask的全局变量
        db.create_all()

    app.run(host='127.0.0.1', port=5000, debug=True)


到了这里,关于flask-sqlalchemy结合Blueprint遇到循环引入问题的解决方案的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Flask-sqlalchemy更新数据库

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

    2023年04月08日
    浏览(40)
  • flask-sqlalchemy连接数据库

    1、安装flask_sqlalchemy和pymysql包 2、进行配置 使用Flask-SQLAlchemy扩展操作数据库,首先需要通过URL建立数据库连接,必须保存到Flask配置对象的SQLALCHEMY_DATABASE_URI中。 其中HOSTNAME为路由地址 PORT为端口号,我在创建数据库时没有更改,所以用的默认的3306端口号 DATABASE为数据库名字

    2024年02月06日
    浏览(62)
  • 3.flask-sqlalchemy ORM库

    Flask-SQLAlchemy是一个用于Flask的扩展,它提供了一个便捷的方式来处理数据库操作。Flask-SQLAlchemy基于SQLAlchemy,一个功能强大的Python SQL工具包和对象关系映射(ORM)系统 官网文档: http://www.pythondoc.com/flask-sqlalchemy/ 一对多关系是指一个模型与另一个模型之间存在多对一的关系。在

    2024年02月10日
    浏览(44)
  • flask中的操作数据库的插件Flask-SQLAlchemy

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

    2024年02月09日
    浏览(61)
  • 快速上手Flask(三) 在 Flask应用中使用Flask-SQLAlchemy(flask SQLAlchemy模型对象如何json序列化输出)

    常见情况下对于只有一个 Flask 应用,所有您需要做的事情就是创建 Flask 应用,选择加载配置接着创建 SQLAlchemy 对象时候把 Flask 应用传递给它作为参数。 官网:https://www.sqlalchemy.org/ 参考本人 文章:python常用库之数据库orm框架之SQLAlchemy 官方文档: 中文: http://www.pythondoc.co

    2024年01月25日
    浏览(56)
  • 如何使用Flask-SQLAlchemy来管理数据库连接和操作数据?

    首先,我们需要安装Flask-SQLAlchemy。你可以使用pip来安装它,就像这样: 好了,现在我们已经有了一个可以操作数据库的工具,接下来让我们来看看如何使用它吧! 首先,我们需要创建一个Flask应用对象,并配置数据库的连接字符串和师: 现在,我们已经创建了一个数据库,

    2024年02月15日
    浏览(50)
  • python:使用Flask-SQLAlchemy对数据库增删改查的简单示例

    以下将介绍Flask-SQLAlchemy对数据库增删改查的简单示例。 一、安装所需的库 pip install flask flask-sqlalchemy flask-mysql 二、创建数据表 本示例使用mysql创建数据库和表 CREATE TABLE `user` (   `id` int(11) NOT NULL AUTO_INCREMENT,   `name` varchar(255) DEFAULT NULL,   `age` int(11) DEFAULT NULL,   PRIMARY KEY (`id

    2024年02月07日
    浏览(68)
  • flask---》更多查询方式/连表查询/原生sql(django-orm如何执行原生sql)/flask-sqlalchemy

    sqlalchemy执行原生sql django执行原生sql

    2024年02月13日
    浏览(38)
  • Flask从入门到放弃五(SQLAlchemy介绍与快速使用、创建表插入数据、Scoped_session线程安全、基本增删查改、表模型、Flask-SQLAlchemy、Migrate的使用)

    SQLAlchemy是一个基于Python实现的ORM框架。该框架建立在 DB API之上,使用关系对象映射进行数据库操作,简言之便是:将类和对象转换成SQL,然后使用数据API执行SQL并获取执行结果。 SQLAlchemy的组成部分有: Engine 框架的引擎 Connection Pooling 数据库连接池 Dialect 选择连接数据库的

    2024年02月04日
    浏览(53)
  • 【flask sqlalchmey】一次性将返回的列表对象或者 一行数据对象转成dict---flask-sqlalchemy输出json格式数据

    结果示例: 另外: res = Sysdict.query.all() 这种写法已经不被推荐了, 推荐的是scalar_one() 获取一行,scalars()获取多行 user = db.session.execute(db.select(User).filter_by(username=username)).scalar_one() users = db.session.execute(db.select(User).order_by(User.username)).scalars() 一般的 json.dumps(users) 或者 jsonify(use

    2024年02月13日
    浏览(56)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包