PythonWeb开发框架—Flask框架之flask-sqlalchemy、序列化和反序列化使用详解
1.安装依赖库
pip install flask-sqlalchemy
pip install pymysql
2.连接数据库配置
from flask import Flask
from flask_sqlalchemy import SQLAlchemyapp = Flask(__name__) #创建 Flask 应用实例#配置数据库连接
app.config['SQLALCHEMY_DATABASE_URI']='mysql://root:study123@127.0.0.1:3306/testdevelop?charset=utf8mb4'db=SQLAlchemy() #创建 SQLAlchemy 实例db.init_app(app) #将 db 实例与 Flask 应用绑定,激活数据库功能
3.定义表模型
#定义表模型
class TaskTest(db.Model):#手动定义表名, 否则默认为小写的类名__tablename__ ='task_test'#定义自增主键字段,格式为: 字段名 = db.Column(db.类型, 附加属性[主键/唯一性等])id = db.Column(db.Integer, primary_key=True, autoincrement=True)#定义唯一,且不能为空的字段iphonenumber=db.Column(db.String(15), unique=True, nullable=False)name = db.Column(db.String(128))
常见的表字段类型:
db.Integer 整数类型
db.Float 浮点数
db.String(length) 字符串类型,需指定长度
db.Boolean 布尔值
db.DateTime 时间,精确到秒
db.Date 日期,格式:年-月-日
db.Text 长文本类型,无长度限制
db.Column()里其他参数介绍:
primary_key 默认值为false,设置为true时,表示为表的主键
autoincrement 默认值为false,设置为True时,通常与primary_key一起使用,表示该字段是一个自增的主键
unique 默认值为false,设置为true时,表示该字段数据值唯一,不可重复
default 字段的默认值,可以是常量、变量、表达式
nullable 是否允许为空,默认值为True,表示允许为空
index 默认值false,设置为True表示该字段会被创建索引
foreign_key 表示该字段是一个外键,指向另一个表的主键,值=另一个表表名.字段名
server_ts 设置为true表示服务器会维护该字段的创建时间戳,通常用于审计和日志记录
4.数据迁移
定义表模型后,需要用flask-migrate完成对数据库实际的操作,步骤如下:
安装数据迁移同步工具:
pip install flask_migrate
导入模块:
from flask_migrate import Migrate
创建数据库迁移对象:
migrate = Migrate(app, db)
完整脚本如下:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrateapp = Flask(__name__) #创建 Flask 应用实例#配置数据库连接
app.config['SQLALCHEMY_DATABASE_URI']='mysql://root:study123@127.0.0.1:3306/testdevelop?charset=utf8mb4'db=SQLAlchemy() #创建 SQLAlchemy 实例db.init_app(app) #将 db 实例与 Flask 应用绑定,激活数据库功能migrate = Migrate(app, db) #创建数据库迁移对象
Terminal里依次执行命令:
flask db init
flask db migrate
- flask db upgrade
三条指令的解释:
flask db init
该条命令一个项目执行一次即可,它的作用是创建存储迁移脚本的migrations目录。migrations目录下包含:
- versions文件夹:用来存放每次的迁移脚本
- alembic.ini:迁移工具Alembic的配置文件
- env.py:定义连接数据库的脚本
- script.py.mako:是Alembic迁移脚本模板文件,用于定义每次执行 flask db migrate 时生成的迁移脚本的结构和格式
flask db migrate
根据定义表模型的脚本变化,自动生成迁移脚本.py文件,脚本存放在migrations/versions下,脚本里包含应用变更upgrade()和 回滚变更downgrade()函数
flask db upgrade
执行所有未应用的迁移脚本中的upgrade()函数,实际操作数据库,完成创建表和新增表字段的操作,或者其他表结构变更的操作,同时在数据库中也会创建一个alembic_version表, 用来记录当前版本号
数据回滚操作:
flask db history #查找版本号
flask db downgrade <版本号> #回滚到指定版本
5.数据库操作
5.1 新增表
重新定义一个表模型,执行flask db migrate 和flask db upgrade即可
5.2 新增字段
直接在表模型类下添加字段,执行flask db migrate 和flask db upgrade即可
5.3 插入数据
先实列化表模型类,然后执行:db.session.add()和db.session.commit()
举例说明:
脚本内容:
调用接口:
数据库里检查数据落库情况:
5.4 查询数据
查询所有,返回值是对象:表模型类.query.all()
根据主键查询,返回值是对象:表模型类.query.get(主键)
返回第一条,返回值是对象:表模型类.query.first()
加简单条件查询,返回值是对象:表模型类.query.filter_by().all()
加复杂条件查询,返回值是对象:表模型类.query.filter().all()
查询某个字段的所有数据,返回值是具体的值:db.session.query(模型类.字段).all()
注:在没有反序列化前,输出的值前端不能展示
5.5 修改数据
修改一条数据的某个字段:
批量修改:
5.6 删除数据
删除一条数据:先查询,在删除
删除多条数据:直接执行delete()
6.序列化和反序列化
序列化:把前端数据转化为python对象,通过 Python脚本添加到数据库
反序列化:把Python对像转化为前端要的json格式
安装依赖库:
pip install flask-marshmallow
pip install marshmallow-sqlalchemy
导入模块
from marshmallow_sqlalchemy import SQLAlchemyAutoSchema
from marshmallow import post_load
构造模型器:
class TaskInfoSchema(SQLAlchemyAutoSchema):class Meta: #固定写法:Metamodel=TaskInfo() #定义表task_info的类名fields=['taskname','device_list'] #多个字段放在一个列表中
序列化器:重构load()
为什么要重构load():因为直接使用默认load()出来的还是原始字典,不是python对象,在db.session.add_all()时会报错。
序列化操作:
视图函数:
from flask import request@app.route('/loaddata',methods=['GET','POST'])
def loaddata():task_info_list=request.json.get("data")task_info=TaskInfoSchema()add_task_info=task_info.load(task_info_list,many=True)print(add_task_info)return '序列化成功'
前端调用:
数据库检查:
反序列操作:
视图函数:
from flask import jsonify, make_response@app.route('/dumpdata')
def dumpdata():all_records=TaskInfo.query.all()json_data=TaskInfoSchema().dump(all_records,many=True) #多条数据要加many=Truereturn make_response(jsonify(data=json_data), 200)
前端调用:
相关文章:

PythonWeb开发框架—Flask框架之flask-sqlalchemy、序列化和反序列化使用详解
1.安装依赖库 pip install flask-sqlalchemy pip install pymysql 2.连接数据库配置 from flask import Flask from flask_sqlalchemy import SQLAlchemyapp Flask(__name__) #创建 Flask 应用实例#配置数据库连接 app.config[SQLALCHEMY_DATABASE_URI]mysql://root:stud…...
如何监控 Pod 的 CPU/内存使用率,prometheus+grafana
一、监控 Pod 的 CPU/内存使用率的方法 1. 使用 kubectl top 命令(临时检查) # 查看所有 Pod 的资源使用率(需安装 Metrics Server) kubectl top pods --all-namespaces # 查看指定命名空间的 Pod kubectl top pods -n <n…...
Spring Batch 概览
Spring Batch 是什么? Spring Batch 是 Spring 生态系统中的一个轻量级批处理框架,专门用于处理大规模数据任务。它特别适合企业级应用中需要批量处理数据的场景,比如数据迁移、报表生成、ETL(Extract-Transform-Load)…...

用Deepseek写一个五子棋微信小程序
在当今快节奏的生活中,休闲小游戏成为了许多人放松心情的好选择。五子棋作为一款经典的策略游戏,不仅规则简单,还能锻炼思维。最近,我借助 DeepSeek 的帮助,开发了一款五子棋微信小程序。在这篇文章中,我将…...
AF3 squeeze_features函数解读
AlphaFold3 data_transforms 模块的 squeeze_features 函数的作用去除 蛋白质特征张量中不必要的单维度(singleton dimensions)和重复维度,以使其适配 AlphaFold3 预期的输入格式。 源代码: def squeeze_features(protein):&qu…...

Python 远程抓取服务器日志最后 1000行
哈喽,大家好,我是木头左! 一、神奇的 Python 工具箱 1. SSH 连接的密钥——paramiko paramiko 库提供了丰富的方法来处理 SSH 连接的各种细节。从创建连接对象,到执行远程命令,再到获取命令输出,它都能有…...

vue3+screenfull实现部分页面全屏(遇到的问题会持续更新)
需求:除了左侧菜单,右侧主体部分全部全屏 首先下载screenfull全屏插件 npm install screenfull --save页面引入 import screenfull from screenfull;我这里是右上角全屏图标 <el-iconref"elIconRef"color"#ffffff"size"2…...
Ubuntu 下 nginx-1.24.0 源码分析 (1)
main 函数在 src\core\nginx.c int ngx_cdecl main(int argc, char *const *argv) {ngx_buf_t *b;ngx_log_t *log;ngx_uint_t i;ngx_cycle_t *cycle, init_cycle;ngx_conf_dump_t *cd;ngx_core_conf_t *ccf;ngx_debug_init(); 进入 main 函数 最…...

2025数据存储技术风向标:解析数据湖与数据仓库的实战效能差距
一、技术演进的十字路口 当前全球数据量正以每年65%的复合增长率激增,IDC预测到2027年企业将面临日均处理500TB数据的挑战。在这样的背景下,传统数据仓库与新兴数据湖的博弈进入白热化阶段。Gartner最新报告显示,采用混合架构的企业数据运营效…...

探索高性能AI识别和边缘计算 | NVIDIA Jetson Orin Nano 8GB 开发套件的全面测评
随着边缘计算和人工智能技术的迅速发展,性能强大的嵌入式AI开发板成为开发者和企业关注的焦点。NVIDIA近期推出的Jetson Orin Nano 8GB开发套件,凭借其40 TOPS算力、高效的Ampere架构GPU以及出色的边缘AI能力,引起了广泛关注。本文将从配置性…...

数据结构 常见的排序算法
🌻个人主页:路飞雪吖~ 🌠专栏:数据结构 目录 🌻个人主页:路飞雪吖~ 一、插入排序 🌟直接插入排序 🌟希尔排序 二、选择排序 🌟选择排序 🌟堆排序…...
ES索引知识
索引是数据的载体,存储了文档和映射的信息 索引是具有相同结构的文档的合集体。 设置索引,不仅仅是设置索引名字,还有索引的一些配置,比如:分片和副本,刷新频率,搜索结果的最大参数,…...
FreeRTOS第17篇:FreeRTOS链表实现细节05_MiniListItem_t:FreeRTOS内存优化
文/指尖动听知识库-星愿 文章为付费内容,商业行为,禁止私自转载及抄袭,违者必究!!! 文章专栏:深入FreeRTOS内核:从原理到实战的嵌入式开发指南 1 为什么需要迷你列表项? 在嵌入式系统中,内存资源极其宝贵。FreeRTOS为满足不同场景需求,设计了标准列表项(ListItem_…...
Golang | Gin(简洁版)
文章目录 安装使用RESTful API响应页面获取请求参数路由讲解中间件 安装使用 Gin 是一个 golang 的微框架,封装比较优雅,API 友好,源代码比较明确。具有快速灵活,容错方便等特点。其实对于 golang 而言,web 框架的依赖…...

RAG外挂知识库
目录 RAG的工作流程 python实现RAG 1.引入相关库及相关准备工作 函数 1. 加载并读取文档 2. 文档分割 3. embedding 4. 向集合中添加文档 5. 用户输入内容 6. 查询集合中的文档 7. 构建Prompt并生成答案 主流程 附录 函数解释 1. open() 函数语法 2.client.embe…...

Rust语言:开启高效编程之旅
目录 一、Rust 语言初相识 二、Rust 语言的独特魅力 2.1 内存安全:消除隐患的护盾 2.2 高性能:与 C/C++ 并肩的实力 2.3 强大的并发性:多线程编程的利器 2.4 跨平台性:适配多环境的优势 三、快速上手 Rust 3.1 环境搭建:为开发做准备 3.2 第一个 R…...

蓝桥杯备考:图论初解
1:图的定义 我们学了线性表和树的结构,那什么是图呢? 线性表是一个串一个是一对一的结构 树是一对多的,每个结点可以有多个孩子,但只能有一个父亲 而我们今天学的图!就是多对多的结构了 V表示的是图的顶点集…...
Codeforces Round 502 E. The Supersonic Rocket 凸包、kmp
题目链接 题目大意 平面上给定两个点集,判定两个点集分别形成的凸多边形能否通过旋转、平移重合。 点集大小 ≤ \leq ≤ 1 0 5 10^{5} 105,坐标范围 [0, 1 0 8 10^{8} 108 ]. 思路 题意很明显,先求出凸包再判断两凸包是否同构。这里用…...
机器人匹诺曹机制,真话假话平衡机制
摘要: 本文聚焦于机器人所采用的一种“匹诺曹机制”,该机制旨在以大概率保持“虚拟鼻子”(一种象征虚假程度的概念)不会过长,通过在对话中夹杂真话与假话来实现。文章深入探讨了这一机制的原理,分析其背后的…...

用Python分割并高效处理PDF大文件
在处理大型PDF文件时,将它们分解成更小、更易于管理的块通常是有益的。这个过程称为分区,它可以提高处理效率,并使分析或操作文档变得更容易。在本文中,我们将讨论如何使用Python和为Unstructured.io库将PDF文件划分为更小的部分。…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...

云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...

论文笔记——相干体技术在裂缝预测中的应用研究
目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...
LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》
这段 Python 代码是一个完整的 知识库数据库操作模块,用于对本地知识库系统中的知识库进行增删改查(CRUD)操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 📘 一、整体功能概述 该模块…...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...