当前位置: 首页 > news >正文

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 命令&#xff08;临时检查&#xff09; # 查看所有 Pod 的资源使用率&#xff08;需安装 Metrics Server&#xff09; kubectl top pods --all-namespaces ​ # 查看指定命名空间的 Pod kubectl top pods -n <n…...

Spring Batch 概览

Spring Batch 是什么&#xff1f; Spring Batch 是 Spring 生态系统中的一个轻量级批处理框架&#xff0c;专门用于处理大规模数据任务。它特别适合企业级应用中需要批量处理数据的场景&#xff0c;比如数据迁移、报表生成、ETL&#xff08;Extract-Transform-Load&#xff09…...

用Deepseek写一个五子棋微信小程序

在当今快节奏的生活中&#xff0c;休闲小游戏成为了许多人放松心情的好选择。五子棋作为一款经典的策略游戏&#xff0c;不仅规则简单&#xff0c;还能锻炼思维。最近&#xff0c;我借助 DeepSeek 的帮助&#xff0c;开发了一款五子棋微信小程序。在这篇文章中&#xff0c;我将…...

AF3 squeeze_features函数解读

AlphaFold3 data_transforms 模块的 squeeze_features 函数的作用去除 蛋白质特征张量中不必要的单维度&#xff08;singleton dimensions&#xff09;和重复维度&#xff0c;以使其适配 AlphaFold3 预期的输入格式。 源代码&#xff1a; def squeeze_features(protein):&qu…...

Python 远程抓取服务器日志最后 1000行

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

vue3+screenfull实现部分页面全屏(遇到的问题会持续更新)

需求&#xff1a;除了左侧菜单&#xff0c;右侧主体部分全部全屏 首先下载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%的复合增长率激增&#xff0c;IDC预测到2027年企业将面临日均处理500TB数据的挑战。在这样的背景下&#xff0c;传统数据仓库与新兴数据湖的博弈进入白热化阶段。Gartner最新报告显示&#xff0c;采用混合架构的企业数据运营效…...

探索高性能AI识别和边缘计算 | NVIDIA Jetson Orin Nano 8GB 开发套件的全面测评

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

数据结构 常见的排序算法

&#x1f33b;个人主页&#xff1a;路飞雪吖~ &#x1f320;专栏&#xff1a;数据结构 目录 &#x1f33b;个人主页&#xff1a;路飞雪吖~ 一、插入排序 &#x1f31f;直接插入排序 &#x1f31f;希尔排序 二、选择排序 &#x1f31f;选择排序 &#x1f31f;堆排序…...

ES索引知识

索引是数据的载体&#xff0c;存储了文档和映射的信息 索引是具有相同结构的文档的合集体。 设置索引&#xff0c;不仅仅是设置索引名字&#xff0c;还有索引的一些配置&#xff0c;比如&#xff1a;分片和副本&#xff0c;刷新频率&#xff0c;搜索结果的最大参数&#xff0c…...

FreeRTOS第17篇:FreeRTOS链表实现细节05_MiniListItem_t:FreeRTOS内存优化

文/指尖动听知识库-星愿 文章为付费内容,商业行为,禁止私自转载及抄袭,违者必究!!! 文章专栏:深入FreeRTOS内核:从原理到实战的嵌入式开发指南 1 为什么需要迷你列表项? 在嵌入式系统中,内存资源极其宝贵。FreeRTOS为满足不同场景需求,设计了标准列表项(ListItem_…...

Golang | Gin(简洁版)

文章目录 安装使用RESTful API响应页面获取请求参数路由讲解中间件 安装使用 Gin 是一个 golang 的微框架&#xff0c;封装比较优雅&#xff0c;API 友好&#xff0c;源代码比较明确。具有快速灵活&#xff0c;容错方便等特点。其实对于 golang 而言&#xff0c;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&#xff1a;图的定义 我们学了线性表和树的结构&#xff0c;那什么是图呢&#xff1f; 线性表是一个串一个是一对一的结构 树是一对多的&#xff0c;每个结点可以有多个孩子&#xff0c;但只能有一个父亲 而我们今天学的图&#xff01;就是多对多的结构了 V表示的是图的顶点集…...

Codeforces Round 502 E. The Supersonic Rocket 凸包、kmp

题目链接 题目大意 平面上给定两个点集&#xff0c;判定两个点集分别形成的凸多边形能否通过旋转、平移重合。 点集大小 ≤ \leq ≤ 1 0 5 10^{5} 105&#xff0c;坐标范围 [0, 1 0 8 10^{8} 108 ]. 思路 题意很明显&#xff0c;先求出凸包再判断两凸包是否同构。这里用…...

机器人匹诺曹机制,真话假话平衡机制

摘要&#xff1a; 本文聚焦于机器人所采用的一种“匹诺曹机制”&#xff0c;该机制旨在以大概率保持“虚拟鼻子”&#xff08;一种象征虚假程度的概念&#xff09;不会过长&#xff0c;通过在对话中夹杂真话与假话来实现。文章深入探讨了这一机制的原理&#xff0c;分析其背后的…...

用Python分割并高效处理PDF大文件

在处理大型PDF文件时&#xff0c;将它们分解成更小、更易于管理的块通常是有益的。这个过程称为分区&#xff0c;它可以提高处理效率&#xff0c;并使分析或操作文档变得更容易。在本文中&#xff0c;我们将讨论如何使用Python和为Unstructured.io库将PDF文件划分为更小的部分。…...

AtCoder 第409​场初级竞赛 A~E题解

A Conflict 【题目链接】 原题链接&#xff1a;A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串&#xff0c;只有在同时为 o 时输出 Yes 并结束程序&#xff0c;否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

oracle与MySQL数据库之间数据同步的技术要点

Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异&#xff0c;它们的数据同步要求既要保持数据的准确性和一致性&#xff0c;又要处理好性能问题。以下是一些主要的技术要点&#xff1a; 数据结构差异 数据类型差异&#xff…...

Nginx server_name 配置说明

Nginx 是一个高性能的反向代理和负载均衡服务器&#xff0c;其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机&#xff08;Virtual Host&#xff09;。 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步搭建智能关系网络!

一、引言 在数据驱动的背景下&#xff0c;知识图谱凭借其高效的信息组织能力&#xff0c;正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合&#xff0c;探讨知识图谱开发的实现细节&#xff0c;帮助读者掌握该技术栈在实际项目中的落地方法。 …...

基于matlab策略迭代和值迭代法的动态规划

经典的基于策略迭代和值迭代法的动态规划matlab代码&#xff0c;实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...

云原生玩法三问:构建自定义开发环境

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

论文笔记——相干体技术在裂缝预测中的应用研究

目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术&#xff1a;基于互相关的相干体技术&#xff08;Correlation&#xff09;第二代相干体技术&#xff1a;基于相似的相干体技术&#xff08;Semblance&#xff09;基于多道相似的相干体…...

LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》

这段 Python 代码是一个完整的 知识库数据库操作模块&#xff0c;用于对本地知识库系统中的知识库进行增删改查&#xff08;CRUD&#xff09;操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 &#x1f4d8; 一、整体功能概述 该模块…...

JS手写代码篇----使用Promise封装AJAX请求

15、使用Promise封装AJAX请求 promise就有reject和resolve了&#xff0c;就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...