快速上手Flask(三) 在 Flask应用中使用Flask-SQLAlchemy(flask SQLAlchemy模型对象如何json序列化输出)

文章目录

  • 快速上手Flask(三) 在 Flask应用中使用Flask-SQLAlchemy
    • SQLAlchemy
    • 什么是Flask-SQLAlchemy
    • Flask-SQLAlchemy 和 SQLAlchemy的区别?
    • Flask-SQLAlchemy基本使用
      • 安装:
      • 快速入门
        • 创建模型
        • flask模型对象如何json序列化输出
      • 数据库的增删改查
    • 工作常用总结
      • 在 SQLAlchemy 中,怎么判断删除是否成功?

快速上手Flask(三) 在 Flask应用中使用Flask-SQLAlchemy

常见情况下对于只有一个 Flask 应用,所有您需要做的事情就是创建 Flask 应用,选择加载配置接着创建 SQLAlchemy 对象时候把 Flask 应用传递给它作为参数。

SQLAlchemy

官网:https://www.sqlalchemy.org/

参考本人 文章:python常用库之数据库orm框架之SQLAlchemy

什么是Flask-SQLAlchemy

官方文档:
中文:http://www.pythondoc.com/flask-sqlalchemy/index.html
[推荐]英文:https://flask-sqlalchemy.palletsprojects.com/en/3.1.x/

Flask-SQLAlchemy是一个Flask扩展,用于在Flask应用程序中简化与SQL数据库的交互。它提供了一个集成的ORM(对象关系映射)工具,使得在Flask应用程序中进行数据库操作更加方便和高效。

Flask-SQLAlchemy 和 SQLAlchemy的区别?

Flask-SQLAlchemy 是基于 SQLAlchemy 的 Flask 扩展,它提供了在 Flask 应用中更方便地使用 SQLAlchemy 的功能和特性。

  • 集成度:Flask-SQLAlchemy 是针对 Flask 框架的封装,提供了与 Flask 应用无缝集成的功能。它简化了在 Flask 应用中使用 SQLAlchemy 的配置和使用过程,提供了更简洁的接口和功能。

  • 配置:Flask-SQLAlchemy 提供了在 Flask 应用中配置 SQLAlchemy 的方式,可以直接在 Flask 配置中进行数据库相关的配置。而 SQLAlchemy 需要单独进行配置,通常使用一个独立的配置文件或模块。

  • 上下文管理:Flask-SQLAlchemy 自动处理了 SQLAlchemy 的上下文管理,确保在每个请求中使用正确的数据库会话。它与 Flask 的应用上下文和请求上下文无缝集成,提供了更方便的数据库操作方式。

  • 扩展功能:Flask-SQLAlchemy 提供了一些额外的功能和特性,如自动提交和回滚事务、自动创建数据库表、数据库迁移等。它还与 Flask-WTF 和 Flask-Admin 等其他 Flask 扩展集成得更紧密,提供了更丰富的功能和集成选项。

总结:

  1. SQLAlchemy:是一个独立的ORM框架,可以独立与Flask存在,也可以在其他项目中使用,比如在Django中。
  2. Flask-SQLAlchemy:对SQLAlchemy的一个封装,能够更适合在Flask中使用。

您仅需要知道与普通的 SQLAlchemy 不同之处:

  1. SQLAlchemy 允许您访问下面的东西:
    • sqlalchemy 和 sqlalchemy.orm 下所有的函数和类
    • 一个叫做 session 的预配置范围的会话(session)
    • metadata 属性
    • engine 属性
    • SQLAlchemy.create_all() 和 SQLAlchemy.drop_all(),根据模型用来创建以及删除表格的方法
    • 一个 Model 基类,即是一个已配置的声明(declarative)的基础(base)
  2. Model 声明基类行为类似一个常规的 Python 类,不过有个 query 属性,可以用来查询模型 (Model 和 BaseQuery)
  3. 您必须提交会话,但是没有必要在每个请求后删除它(session),Flask-SQLAlchemy 会帮您完成删除操作

Flask-SQLAlchemy基本使用

安装:

pip install -U Flask-SQLAlchemy

快速入门

快速入门
参考URL: http://www.pythondoc.com/flask-sqlalchemy/quickstart.html

from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemyapp = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:tmp/test.db'
db = SQLAlchemy(app)class User(db.Model):id = db.Column(db.Integer, primary_key=True)username = db.Column(db.String(80), unique=True)email = db.Column(db.String(120), unique=True)def __init__(self, username, email):self.username = usernameself.email = emaildef __repr__(self):return '<User %r>' % self.username

在 Flask 中使用 SQLAlchemy 进行数据库操作时,你应该在全局范围内创建一个 db 对象。

from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import create_engine
from sqlalchemy.pool import QueuePooldb = SQLAlchemy()# 数据库连接配置
DATABASE_URI = 'postgresql://username:password@localhost:5432/database_name'
DATABASE_TRACK_MODIFICATIONS = False# SQLAlchemy配置
SQLALCHEMY_DATABASE_URI = DATABASE_URI
SQLALCHEMY_TRACK_MODIFICATIONS = DATABASE_TRACK_MODIFICATIONS
SQLALCHEMY_ENGINE_OPTIONS = {'poolclass': QueuePool,'pool_size': 10,'max_overflow': 5,'pool_pre_ping': True
}# 创建数据库引擎
engine = create_engine(DATABASE_URI, poolclass=QueuePool, pool_size=10, max_overflow=5, pool_pre_ping=True)

SQLALCHEMY_ENGINE_OPTIONS:这是SQLAlchemy的引擎配置选项,用于配置连接池的相关参数,例如pool_size和max_overflow。
engine:这是使用create_engine函数创建的数据库引擎对象,可以在需要直接使用底层引擎的情况下使用。

在你的代码中,你已经正确地创建了一个 db 对象,并将其与 Flask 应用程序绑定。这样做可以确保在整个应用程序中使用相同的数据库实例。

from flask import Flask
from api import create_app
from sqlalchemy_db import db, SQLALCHEMY_DATABASE_URI, SQLALCHEMY_TRACK_MODIFICATIONS, SQLALCHEMY_ENGINE_OPTIONSapp = create_app(os.getenv('FLASK_CONFIG') or 'default')# 配置数据库连接URI和选项
app.config['SQLALCHEMY_DATABASE_URI'] = SQLALCHEMY_DATABASE_URI
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = SQLALCHEMY_TRACK_MODIFICATIONS
app.config['SQLALCHEMY_ENGINE_OPTIONS'] = SQLALCHEMY_ENGINE_OPTIONS# 将db对象与Flask应用程序关联
db.init_app(app)

在执行原生SQL语句时,使用engine对象。

以下是一个示例代码,演示了如何使用engine对象执行原生SQL查询:

from sqlalchemy_db import enginedef execute_native_sql(query):with engine.connect() as connection:result = connection.execute(query)for row in result:print(row)# 示例查询
query = "SELECT * FROM users"
execute_native_sql(query)

在上面的代码中,我们创建了一个execute_native_sql函数,它使用engine对象执行原生SQL查询并打印结果。

请注意,在使用engine对象时,你需要根据具体的情况选择适当的上下文管理器(with语句)来保证连接的正确关闭。

如果你只是想使用SQLAlchemy的ORM功能(例如定义模型类、执行查询等),则可以直接使用db对象,而不需要直接使用engine对象。

创建模型

在使用SQLAlchemy之前,你需要先定义数据库模型类。模型类代表了数据库中的表结构,并提供了与表相关联的字段和方法。

from sqlalchemy_db import dbclass User(db.Model):__tablename__ = 'users'id = db.Column(db.Integer, primary_key=True)username = db.Column(db.String(50), unique=True, nullable=False)email = db.Column(db.String(100), unique=True, nullable=False)def __repr__(self):return f'<User(id={self.id}, username={self.username}, email={self.email})>'

在上面的示例中,我们定义了一个名为User的模型类,它对应了数据库中的users表。User类继承了db.Model,这是SQLAlchemy提供的基类。

from sqlalchemy_db import db
from models import User# 创建数据库表
db.create_all()# 创建一个新用户
user = User(username='john', email='john@example.com')
db.session.add(user)
db.session.commit()# 查询所有用户
users = User.query.all()
for user in users:print(user)# 查询特定用户
user = User.query.filter_by(username='john').first()
print(user)# 更新用户信息
user.email = 'newemail@example.com'
db.session.commit()# 删除用户
db.session.delete(user)
db.session.commit()

我们使用db.session来进行数据库操作,例如添加、查询、更新和删除用户记录。

flask模型对象如何json序列化输出

[推荐]Flask 学习-36.Flask-RESTful 序列化输出对象
参考URL:https://www.cnblogs.com/yoyoketang/p/16648730.html

通过flask-SQLAlchemy这一ORM工具所构建的数据库表模型,通过其语句所取出的数据通常是object类型的,这一类型并不能直接在方法中return返回一个JSON格式,因此需要先对从数据库中取出的数据进行序列化,然后再return给前端。

在网络上找到的三种序列化方法如下:

在模型定义的时候给序列化的方法
继承改写 flask 里面的 JSONEncoder类以及default方法
使用Marshmallow

装饰器marshal_with实际上是获取您的数据对象并应用字段过滤。编组可以处理单个对象、字典或对象列表。

https://www.cnblogs.com/yoyoketang/p/16648730.html

使用Flask-RESTful 提供的 fields 模块序列化输出需要的字段

from flask_restful import Resource, fields, marshal_with

user_fields = {
‘id’: fields.Integer,
‘username’: fields.String,
‘is_active’: fields.Boolean
}

class UserInfo(Resource):

@marshal_with(user_fields)
def get(self):user = Users.query.get(1)print(f'查询到的数据:{user}')return user

marshal_with 装饰器只能对return的对象序列化,这里可以使用 marshal() 函数实现部分序列化

数据库的增删改查

Flask和SQLAlchemy的模型操作:增删改查方法详解
参考URL: https://www.51cto.com/article/757138.html

查询模型
在Flask和SQLAlchemy中,我们可以使用以下方法来查询模型:

查询所有模型:

users = User.query.all()

这将返回所有的用户模型对象。

查询单个模型:

user = User.query.filter_by(username='john').first()

这将返回一个用户名为’john’的用户模型对象。

使用复杂查询:

users = User.query.filter(User.email.endswith('@example.com')).all()

这将返回所有电子邮件以’@example.com’结尾的用户模型对象。

修改模型
在Flask和SQLAlchemy中,我们可以使用以下方法来修改模型:

修改单个属性:

user = User.query.filter_by(username='john').first()
user.email = 'newemail@example.com'
db.session.commit()

修改多个属性:

user = User.query.filter_by(username='john').first()
user.email = 'newemail@example.com'
user.password = 'newpassword'
db.session.commit()

这将修改用户名为’john’的用户的电子邮件和密码,并将更改保存到数据库。

删除模型
在Flask和SQLAlchemy中,我们可以使用以下方法来删除模型:

删除单个模型:

user = User.query.filter_by(username='john').first()
db.session.delete(user)
db.session.commit()

这将删除用户名为’john’的用户模型对象,并将更改保存到数据库。

删除多个模型:

users = User.query.filter_by(email='oldemail@example.com').all()
for user in users:db.session.delete(user)
db.session.commit()

完整的代码示例如下:

from flask import Flask
from flask_sqlalchemy import SQLAlchemyapp = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///mydatabase.db'
db = SQLAlchemy(app)class User(db.Model):id = db.Column(db.Integer, primary_key=True)username = db.Column(db.String(80), unique=True, nullable=False)email = db.Column(db.String(120), unique=True, nullable=False)password = db.Column(db.String(120), nullable=False)def __repr__(self):return '<User %r>' % self.username# create database tables
db.create_all()# add a new user to the database
user = User(username='john', email='john@example.com', password='password')
db.session.add(user)
db.session.commit()# query all users
users = User.query.all()
print(users)# query a single user
user = User.query.filter_by(username='john').first()
print(user)# modify a user's email
user = User.query.filter_by(username='john').first()
user.email = 'newemail@example.com'
user.password = 'newpassword'
db.session.commit()# delete a user
user = User.query.filter_by(username='john').first()
db.session.delete(user)
db.session.commit()

首先定义了一个User模型类,并使用db.create_all()方法创建了数据库表格。接着,我们添加了一个新用户到数据库中,并使用User.query.all()和User.query.filter_by()方法查询了用户。然后,我们修改了用户的电子邮件和密码,并使用db.session.commit()方法将更改保存到数据库。最后,我们使用db.session.delete()方法删除了用户,并使用db.session.commit()方法将更改保存到数据库。

工作常用总结

在 SQLAlchemy 中,怎么判断删除是否成功?

官方文档:https://docs.sqlalchemy.org/en/14/orm/query.html#sqlalchemy.orm.Query.delete

在 SQLAlchemy 中,可以使用 execute() 方法执行 DELETE 语句,delete() 方法返回的是一个整数,表示被删除的记录数。

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker# 创建引擎和Session
engine = create_engine('sqlite:///test.db')
session = sessionmaker(bind=engine)()try:# 定义模型类(这里以User为例)class User(Base):__tablename__ = 'users'id = Column(Integer, primary_key=True)name = Column(String)# 查询所有名字为"John"的用户users = session.query(User).filter(User.name == "John").all()if len(users) > 0:# 删除第一个找到的用户deleted_count = session.delete(users[0])print("已删除{}个用户".format(deleted_count))session.commit()else:print("未找到任何符合条件的用户")
except Exception as e:print("删除失败:", str(e))
finally:session.close()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/639798.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

轮胎侧偏刚度线性插值方法

一、trucksim取数据 步骤一 步骤二 二、数据导入到matlab中 利用simulink的look up table模块 1是侧偏角&#xff1b;2是垂直载荷&#xff1b;输出是侧向力。 侧向力除以侧偏角就是实时的侧偏刚度。

【LeetCode】每日一题 2024_1_21 分割数组的最大值(二分)

文章目录 LeetCode&#xff1f;启动&#xff01;&#xff01;&#xff01;题目&#xff1a;分割数组的最大值题目描述代码与解题思路 LeetCode&#xff1f;启动&#xff01;&#xff01;&#xff01; 今天是 hard&#xff0c;难受&#xff0c;还好有题解大哥的清晰讲解 题目&a…

C#实现基于Word保护性模板文件的修改

目录 制作一个保护性模板文件 给文件设置保护密码 设计模板内容 限制编辑 进一步的需求 范例运行环境 Office DCOM 配置 设计实现 进一步修改模板文件 设置和取消保护 遍历WORD内容控件 总结 制作一个保护性模板文件 在类似一些OA的自动化处理或审批类系统里&a…

一文读懂 c++ 容器

容器根据不同的使用场景和需求,有序序列、无序集合以及专门的适配器等各种形式。了解如何根据场景选择合适的容器并使用它们,是写出高效可读性强的 C++ 代码的关键所在,C++ 标准库提供了一系列标准容器来存储和操作数据集合。这些容器被设计为通用、高效且易于使用。它们都是…

【 文本到上下文 #4】NLP 与 ML

一、说明 欢迎回到我们的 NLP 博客系列&#xff01;当我们进入第四部分时&#xff0c;焦点转移到机器学习 &#xff08;ML&#xff09; 和自然语言处理 &#xff08;NLP&#xff09; 之间的动态相互作用上。在本章中&#xff0c;我们将深入探讨 ML 和 NLP 的迷人协同作用&#…

CGAL::Plane_3<K>平面结构

CGAL::Plane_3<K> 是 CGAL&#xff08;Computational Geometry Algorithms Library&#xff09;中的一个类&#xff0c;代表三维空间中的一个平面。在这个类中&#xff0c;K 是一个内核类型参数&#xff0c;通常代表了一组几何对象的类型和操作&#xff0c;比如点、向量、…

【Linux】Shell 命令以及运行原理

Shell 命令以及运行原理 当用户登录 Linux 系统的时候&#xff0c;系统会给用户创建一个新的进程&#xff0c;一般叫做 bash&#xff08;命令行解释器&#xff09;。 Linux 严格意义上说的是一个操作系统&#xff0c;我们称之为 “核心&#xff08; kernel &#xff09;” &…

如何在 Linux 服务器上设置定时任务?

定时任务&#xff0c;也称为计划任务或cron作业&#xff0c;是在指定的时间间隔内自动执行特定任务的一种方法。在Linux服务器上设置定时任务可以帮助您自动化许多常见的系统管理任务&#xff0c;例如备份数据、清理日志文件、发送通知等。下面是在Linux服务器上设置定时任务的…

Leetcode 3013. Divide an Array Into Subarrays With Minimum Cost II

Leetcode 3013. Divide an Array Into Subarrays With Minimum Cost II 1. 解题思路2. 代码实现 题目链接&#xff1a;3013. Divide an Array Into Subarrays With Minimum Cost II 1. 解题思路 这一题的话思路上的话我一开始是想着偷懒直接用动态规划&#xff0c;结果果然还…

Kafka 问题排查

订单宽表数据不同步 事情的起因是专员在 ze app 上查不到订单了&#xff0c;而订单数据是从 mysql 的 order_search_info 查询的&#xff0c;order_search_info 表的数据是从 oracel 的 BZ_ORDER_INFO 表同步过来的&#xff0c;查不到说明同步有问题 首先重启&#xff0c;同步…

ICMP控制消息 汇总

控制消息由 类型 字段中的值标识。代码 字段给出了消息的附加上下文信息。自协议首次引入以来&#xff0c;一些控制消息已被弃用。 重要的ICMP Control Message控制信息 类型码状态描述0 –回声回复&#xff1a;140回声回复&#xff08;用于ping&#xff09;1和2未分配已预留3 …

0004.电脑开机提示按F1

常用的电脑主板不知道什么原因&#xff0c;莫名其妙的启动不了了。尝试了很多方法&#xff0c;没有奏效。没有办法我就只能把硬盘拆了下来&#xff0c;装到了另一台电脑上面。但是开机以后却提示F1&#xff0c;如下图&#xff1a; 根据上面的提示&#xff0c;应该是驱动有问题…

Spring Security工作原理(三)

在认证之间保存请求 如处理安全异常中所示,当请求没有认证且需要认证资源时,需要保存请求以便在认证成功后重新请求受保护的资源。在Spring Security中,这是通过使用RequestCache实现来保存HttpServletRequest来实现的。 RequestCache HttpServletRequest被保存在Request…

可替代Allegro A3901的国产GC3901 5V H 桥驱动器,驱动电流能力更强,且低成本,大电流

步进电机驱动的应用方案目前市场上大多选用国外品牌的电机驱动器&#xff0c;其中ALLEGRO的A3901在这一块的应用很广泛。但是由于市场越来越成熟&#xff0c;当前对于产品开发成本要求也越来越低&#xff0c;国产品牌也推出了相应的镜头驱动器&#xff0c;因此ALLEGRO的A3901已…

Redis和RediSearch的安装及使用

1. 安装要求 ReadiSearch要求Redis的版本在6.0以上RediSearch 要求使用 GNU Make 4.0 或更高版本 2. Redis的安装 查看redis的版本&#xff1a; redis-server --version或者&#xff0c;如果你已经启动了Redis服务器&#xff0c;你也可以使用redis-cli工具来获取版本信息&a…

Win10/11中VMware Workstation设置网络桥接模式

文章目录 一、添加VMware Bridge Protocol服务二、配置桥接参数1.启用系统Device Install Service服务2.配置VMware 需要确认物理网卡是否有添加VMware Bridge Protocol服务 添加VMware Bridge Protocol服务 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参…

枚举类型有着一篇足以

✅作者简介&#xff1a;大家好&#xff0c;我是橘橙黄又青&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;橘橙黄又青-CSDN博客 1.关键字enum的定义 enum是C语言中的一个关键字&#xff0c;enum叫枚举数据类型&#…

helm 一键部署

helm HPA rancher 安全机制 k8s的核心功能&#xff1a;组件功能 k8s的网络 命令行基本的增删改查 deployment statefulsets 挂载卷&#xff1a;emptyDir&#xff0c; hostPath&#xff0c; nfs pv pvc 动态pvc必问 configmap ingress hpa pod 的自动伸缩 helm 什么是hel…

python opencv 图片缺陷检测(讲解直方图以及相关系数对比法)

一、利用直方图的方式进行批量的图片缺陷检测&#xff08;方法简单&#xff09; 二、步骤&#xff08;完整代码见最后&#xff09; 2.1灰度转换&#xff08;将原图和要检测对比的图分开灰度化&#xff09; 灰度化的作用是因为后面的直方图比较需要以像素256为基准进行相关性比…

Vue2中CesiumV1.113.0加载离线地图

Vue2中CesiumV1.113.0加载离线地图&#xff0c;本文以天地图为例。 1.使用nodejs获取天地图 新建nodejsdownmap项目文件夹&#xff0c;初始化项目 npm init -y src/index.js // An highlighted block var Bagpipe require(bagpipe) var fs require("fs"); var r…