flask入门-3.Flask操作数据库
3. Flask操作数据库
1. 连接数据库
首先下载 MySQL数据库
其次下载对应的包:
pip install pymysql
pip install flask-sqlalchemy
在 app.py 中进行连接测试
from flask import Flask, request, render_template
from flask_sqlalchemy import SQLAlchemyhostname = "127.0.0.1"
port = 3306
username = "root"
password = "root"database = "flask_learn"# 在 app.config 中设置连接数据库的信息
app.config['SQLALCHEMY_DATABASE_URI'] = f"mysql+pymysql://{username}:{password}@{hostname}:{port}/{database}?charset=utf8mb4"
# 使用SQLAlchemy(app)创建一个db对象
# 此时SQLAlchemy辉自动读取app.config中连接数据库的信息
db = SQLAlchemy(app)with app.app_context():with db.engine.connect() as conn:rs = conn.execute("select 1")print(rs.fetchone()) # 输出1说明连接成功, 0说明连接不成功if __name__ == '__main__':app.run(debug=True)
2. ORM模型与表的映射(直接使用代码操作数据库)
在app.py中:
# 定义User类
class User(db.Model):# 声明该实体类和数据库中的user表对应__tablename__ = "user"id = db.Column(db.Integer, primary_key=True, autoincrement=True)username = db.Column(db.String(100), nullable=False)password = db.Column(db.String(100), nullable=False)with app.app_context():db.create_all() # 创建表
3. ORM的CRUD操作
在 app.py 中, 对 user 表进行 CRUD 操作
3.1 添加数据
# ORM的CRUD操作
@app.route('/user/add')
def add_user():# 1. 创建ORM对象user = User(username = '111', password = '111')# 2. 将ORM对象添加到 db.session 中db.session.add(user)# 3. 将db.session 同步到数据库中db.session.commit()return "添加用户成功"
3.2 查找数据
根据主键查找
@app.route('/user/query')
def query_user():# 1. 根据主键查找user = User.query.get(1)print(user.username, user.password)return "查找用户成功"
filter_by 查找
@app.route('/user/query2')
def query_user2():# 2. filter_by 查找# 返回值是Query数组users = User.query.filter_by(username = '111')for user in users:print(user.username, user.password)return "查找用户成功"
3.3 更新数据
@app.route('/user/update')
def update_user():user = User.query.filter_by(username = '111').first()user.password = '222'db.session.commit()return "更新用户成功"
3.4 删除数据
@app.route('/user/delete')
def delete_user():# 1. 根据主键查找user = User.query.get(1)db.session.delete(user)db.session.commit()return "删除用户成功"
4. ORM中外键与数据库表的关系
假设,一个用户可以发表多篇文章,用户与文章是一对多的关系,因此在 article 表中有外键 author_id 对应 user的 id
定义用户类 user 与文章类 article 如下:
# 定义User类
class User(db.Model):# 声明该实体类和数据库中的user表对应__tablename__ = "user"id = db.Column(db.Integer, primary_key=True, autoincrement=True)username = db.Column(db.String(100), nullable=False)password = db.Column(db.String(100), nullable=False)# 创建user表与article表之间的关联关系, 从而可以使得User的对象user通过 user.articles 获得对应的 article 对象的列表 articlesarticles = db.relationship("Article", back_populates="author")class Article(db.Model):__tablename__ = "article"id = db.Column(db.Integer, primary_key=True, autoincrement=True)title = db.Column(db.String(200), nullable=False)content = db.Column(db.Text, nullable=False)# 添加文章对应的作者的外键author_id = db.Column(db.Integer, db.ForeignKey("user.id"))# 创建两个表之间的关联关系, 从而可以使得Article的对象article通过 article.author 获得对应的 user 对象author = db.relationship("User", back_populates="articles")
关联两个表的另一种方式:
# 定义User类
class User(db.Model):# 声明该实体类和数据库中的user表对应__tablename__ = "user"id = db.Column(db.Integer, primary_key=True, autoincrement=True)username = db.Column(db.String(100), nullable=False)password = db.Column(db.String(100), nullable=False)class Article(db.Model):__tablename__ = "article"id = db.Column(db.Integer, primary_key=True, autoincrement=True)title = db.Column(db.String(200), nullable=False)content = db.Column(db.Text, nullable=False)# 添加文章对应的作者的外键author_id = db.Column(db.Integer, db.ForeignKey("user.id"))# 创建两个表之间的关联关系, 从而可以使得Article的对象article通过 article.author 获得对应的 user 对象, 同时 user 会 自动与article 关联, 通过 user.articles 获得对应的 article 对象的列表 articlesauthor = db.relationship("User", backref="articles")
查询某个用户的所有文章:
@app.route('/article/add')
def add_article():article1 = Article(title="aaa", content="aaaaaaaaaaaa")article1.author = User.query.get(2)article2 = Article(title="bbb", content="bbbbbbbbbbbb")article2.author = User.query.get(2)# 添加到session中db.session.add_all([article1, article2])db.session.commit()return "添加文章成功"@app.route('/articles/query')
def query_articles():# 查找某用户的所有文章user = User.query.get(2)articles = user.articlesfor article in articles:print(article.title, article.content, article.author.username)return "查找用户id为2的所有文章成功"
5. 数据库表中字段改变
首先安装包 flask-migrate
pip install flask-migrate
然后在 app.py 中
from flask_migrate import Migrate
hostname = "127.0.0.1"
port = 3306
username = "root"
password = "root"database = "flask_learn"# 在 app.config 中设置连接数据库的信息
app.config['SQLALCHEMY_DATABASE_URI'] = f"mysql+pymysql://{username}:{password}@{hostname}:{port}/{database}?charset=utf8mb4"
# 使用SQLAlchemy(app)创建一个db对象
# 此时SQLAlchemy辉自动读取app.config中连接数据库的信息
db = SQLAlchemy(app)
migrate = Migrate(app, db)
接下来需要将整个项目的所有 ORM实体类 映射到 数据库表中
-
在控制台执行
flask db init(一个项目执行一次)执行结果:

-
在控制台执行
flask db migrate, 识别ORM模型的改变(即识别字段的增删), 生成迁移脚本迁移脚本在 migrate文件夹下的version文件夹下
-
在控制台执行
flask db upgrade, 运行迁移脚本,同步到数据库中
-
只要后端代码对ORM模型(即实体类的属性)进行改变,就需要执行 2和3,从而将其映射到数据库中,使得数据库中的对应字段进行改变
相关文章:
flask入门-3.Flask操作数据库
3. Flask操作数据库 1. 连接数据库 首先下载 MySQL数据库 其次下载对应的包: pip install pymysql pip install flask-sqlalchemy在 app.py 中进行连接测试 from flask import Flask, request, render_template from flask_sqlalchemy import SQLAlchemyhostname "1…...
STM32 使用microros与ROS2通信
本文主要介绍如何在STM32中使用microros与ROS2进行通信,在ROS1中标准的库是rosserial,在ROS2中则是microros,目前网上的资料也有一部分了,但是都没有提供完整可验证的demo,本文将根据提供的demo一步步给大家进行演示。1、首先如果你用的不是S…...
51单片机入门 - 测试:SDCC / Keil C51 会让没有调用的函数参与编译吗?
Small Device C Compiler(SDCC)是一款免费 C 编译器,适用于 8 位微控制器。 不想看测试过程的话可以直接划到最下面看结论:) 关于软硬件环境的信息: Windows 10STC89C52RCSDCC (构建HEX文件&…...
【计算机网络】计算机网络
目录一、概述计算机网络体系结构二、应用层DNS应用文件传输应用DHCP 应用电子邮件应用Web应用当访问一个网页的时候,都会发生什么三、传输层UDP 和 TCP 的特点UDP 首部格式TCP 首部格式TCP 的三次握手TCP 的四次挥手TCP 流量控制TCP 拥塞控制三、网络层IP 数据报格式…...
【java web篇】项目管理构建工具Maven简介以及安装配置
📋 个人简介 💖 作者简介:大家好,我是阿牛,全栈领域优质创作者。😜📝 个人主页:馆主阿牛🔥🎉 支持我:点赞👍收藏⭐️留言Ὅ…...
springboot笔记
微服务架构 微服务是一种架构风格,开发构建应用的时候把应用的业务构建成一个个的小服务(这就类似于把我们的应用程序构建成了一个个小小的盒子,它们在一个大的容器中运行,这种一个个的小盒子我们把它叫做服务)&#…...
【多线程与高并发】- 浅谈volatile
浅谈volatile简介JMM概述volatile的特性1、可见性举个例子总结2、无法保证原子性举个例子分析使用volatile对原子性测试使用锁的机制总结3、禁止指令重排什么是指令重排序重排序怎么提高执行速度重排序的问题所在volatile禁止指令重排序内存屏障(Memory Barrier)作用volatile内…...
avro格式详解
【Avro介绍】Apache Avro是hadoop中的一个子项目,也是一个数据序列化系统,其数据最终以二进制格式,采用行式存储的方式进行存储。Avro提供了:丰富的数据结构可压缩、快速的二进制数据格式一个用来存储持久化数据的容器文件远程过程…...
【涨薪技术】0到1学会性能测试 —— LR录制回放事务检查点
前言 上一次推文我们分享了性能测试分类和应用领域,今天带大家学习性能测试工作原理、事务、检查点!后续文章都会系统分享干货,带大家从0到1学会性能测试,另外还有教程等同步资料,文末免费获取~ 01、LR工作原理 通常…...
卡尔曼滤波原理及代码实战
目录简介1.原理介绍场景假设(1).下一时刻的状态(2).增加系统的内部控制(3).考虑运动系统外部的影响(4).后验估计:预测结果与观测结果的融合卡尔曼增益K2.卡尔曼滤波计算过程(1).预测阶段(先验估计阶段)(2).更新阶段(后验估计阶段&…...
Jmeter使用教程
目录一,简介二,Jmeter安装1,下载2,安装三,创建测试1,创建线程组2,创建HTTP请求默认值3,创建HTTP请求4,添加HTTP请求头5,添加断言6,添加查看结果树…...
论文笔记|固定效应的解释和使用
DeHaan E. Using and interpreting fixed effects models[J]. Available at SSRN 3699777, 2021. 虽然固定效应在金融经济学研究中无处不在,但许多研究人员对作用的了解有限。这篇论文解释了固定效应如何消除遗漏变量偏差并影响标准误差,并讨论了使用固…...
数据集市与数据仓库的区别
数据仓库是企业级的,能为整个企业各个部门的运作提供决策支持;而数据集市则是部门级的,一般只能为某个局部范围内的管理人员服务,因此也称之为部门级数据仓库。 1、两种数据集市结构 数据集市按数据的来源分为以下两种 &#x…...
Golang学习Day3
😋 大家好,我是YAy_17,是一枚爱好网安的小白。 本人水平有限,欢迎各位师傅指点,欢迎关注 😁,一起学习 💗 ,一起进步 ⭐ 。 ⭐ 此后如竟没有炬火,我便是唯一的…...
Python并发编程-事件驱动模型
一、事件驱动模型介绍 1、传统的编程模式 例如:线性模式大致流程 开始--->代码块A--->代码块B--->代码块C--->代码块D--->......---&…...
构建系统发育树简述
1. 要点 系统发育树代表了关于一组生物之间的进化关系的假设。可以使用物种或其他群体的形态学(体型)、生化、行为或分子特征来构建系统发育树。在构建树时,我们根据共享的派生特征(不同于该组祖先的特征)将物种组织成…...
这款 Python 调试神器推荐收藏
大家好,对于每个程序开发者来说,调试几乎是必备技能。 代码写到一半卡住了,不知道这个函数执行完的返回结果是怎样的?调试一下看看 代码运行到一半报错了,什么情况?怎么跟预期的不一样?调试一…...
金三银四吃透这份微服务笔记,面试保准涨10K+
很多人对于微服务技术也都有着一些疑虑,比如: 微服务这技术虽然面试的时候总有人提,但作为一个开发,是不是和我关系不大?那不都是架构师的事吗?微服务不都是大厂在玩吗?我们这个业务体量用得着…...
构建matter over Thread的演示系统-efr32
文章目录1. 简介2. 构建测试系统2.1设置 Matter Hub(Raspberry Pi)2.2 烧录Open Thread RCP固件2.3 烧录待测试的matter设备3. 配网和测试:3.1 使用mattertool建立Thread网络3.2 使用mattertool配置设备入网3.3 使用mattertool控制matter设备3.4 查看节点的Node ID等…...
【一天一门编程语言】Matlab 语言程序设计极简教程
Matlab 语言程序设计极简教程 用 markdown 格式输出答案。 不少于3000字。细分到2级目录。 目录 Matlab 语言程序设计极简教程 简介Matlab 工作空间Matlab 基本数据类型Matlab 语句和表达式Matlab 函数和程序Matlab 图形界面程序设计Matlab 应用实例 简介 Matlab是一种编…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...
centos 7 部署awstats 网站访问检测
一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats࿰…...
新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...
蓝桥杯 冶炼金属
原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...
在Ubuntu24上采用Wine打开SourceInsight
1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...
莫兰迪高级灰总结计划简约商务通用PPT模版
莫兰迪高级灰总结计划简约商务通用PPT模版,莫兰迪调色板清新简约工作汇报PPT模版,莫兰迪时尚风极简设计PPT模版,大学生毕业论文答辩PPT模版,莫兰迪配色总结计划简约商务通用PPT模版,莫兰迪商务汇报PPT模版,…...
Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)
引言 在人工智能飞速发展的今天,大语言模型(Large Language Models, LLMs)已成为技术领域的焦点。从智能写作到代码生成,LLM 的应用场景不断扩展,深刻改变了我们的工作和生活方式。然而,理解这些模型的内部…...
mac:大模型系列测试
0 MAC 前几天经过学生优惠以及国补17K入手了mac studio,然后这两天亲自测试其模型行运用能力如何,是否支持微调、推理速度等能力。下面进入正文。 1 mac 与 unsloth 按照下面的进行安装以及测试,是可以跑通文章里面的代码。训练速度也是很快的。 注意…...
中国政务数据安全建设细化及市场需求分析
(基于新《政务数据共享条例》及相关法规) 一、引言 近年来,中国政府高度重视数字政府建设和数据要素市场化配置改革。《政务数据共享条例》(以下简称“《共享条例》”)的发布,与《中华人民共和国数据安全法》(以下简称“《数据安全法》”)、《中华人民共和国个人信息…...
从数据报表到决策大脑:AI重构电商决策链条
在传统电商运营中,决策链条往往止步于“数据报表层”:BI工具整合历史数据,生成滞后一周甚至更久的销售分析,运营团队凭经验预判需求。当爆款突然断货、促销库存积压时,企业才惊觉标准化BI的决策时差正成为增长瓶颈。 一…...
