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

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实体类 映射到 数据库表中

  1. 在控制台执行 flask db init (一个项目执行一次)

    执行结果:

    image-20230224233333145

    1. 在控制台执行 flask db migrate , 识别ORM模型的改变(即识别字段的增删), 生成迁移脚本

      迁移脚本在 migrate文件夹下的version文件夹下

    2. 在控制台执行 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简介以及安装配置

📋 个人简介 💖 作者简介:大家好,我是阿牛,全栈领域优质创作者。😜📝 个人主页:馆主阿牛🔥🎉 支持我:点赞👍收藏⭐️留言&#x1f4d…...

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是一种编…...

看似平平无奇的00后,居然一跃上岸字节,表示真的卷不过......

又到了一年一度的求职旺季金!三!银!四!在找工作的时候都必须要经历面试这个环节。在这里我想分享一下自己上岸字节的面试经验,过程还挺曲折的,但是还好成功上岸了。大家可以参考一下! 0821测评 …...

BZOJ2142 礼物

题目描述 一年一度的圣诞节快要来到了。每年的圣诞节小E都会收到许多礼物,当然他也会送出许多礼物。不同的人物在小E 心目中的重要性不同,在小E心中分量越重的人,收到的礼物会越多。小E从商店中购买了n件礼物,打算送给m个人 &…...

MySQL高级第一讲

目录 一、MySQL高级01 1.1 索引 1.1.1 索引概述 1.1.2 索引特点 1.1.3 索引结构 1.1.4 BTREE结构(B树) 1.1.5 BTREE结构(B树) 1.1.6 索引分类 1.1.7 索引语法 1.1.8 索引设计原则 1.2 视图 1.2.1 视图概述 1.2.2 创建或修改视图 1.3 存储过程和函数 1.3.1 存储过…...

前端面试常用内容——基础积累

1.清除浮动的方式有哪些? 高度塌陷:当所有的子元素浮动的时候,且父元素没有设置高度,这时候父元素就会产生高度塌陷。 清除浮动的方式: 1.1 给父元素单独定义高度 优点: 快速简单,代码少 缺…...

跟着《代码随想录》刷题(三)——哈希表

3.1 哈希表理论基础 哈希表理论基础 3.2 有效的字母异位词 242.有效的字母异位词 C bool isAnagram(char * s, char * t){int array[26] {0};int i 0;while (s[i]) {// 并不需要记住字符的ASCII码,只需要求出一个相对数值就可以了array[s[i] - a];i;}i 0;whi…...

HTML - 扫盲

文章目录1. 前言2. HTML2.1 下载 vscode3 HTML 常见标签3.1 注释标签3.2 标题标签3.3 段落标签3.4 换行标签3.5 格式化标签1. 加粗2. 倾斜3. 下划线3.6 图片标签3.7 超链接标签3.8 表格标签3.9 列表标签4. 表单标签4.1 from 标签4.2 input 标签4.3 select 标签4.4 textarea标签…...

【系统分析师之路】2022上案例分析历年真题

【系统分析师之路】2022上案例分析历年真题 【系统分析师之路】2022上案例分析历年真题【系统分析师之路】2022上案例分析历年真题2022上案例分析历年真题第一题(25分)2022上案例分析历年真题第二题(25分)2022上案例分析历年真题第…...

Python编程规范

Python编程规范 当今Python编程社区有许多关于编程规范的约定和惯例。以下是一些常见的Python编程规范: 1.使用有意义的命名 使用有意义的命名可以使代码更加清晰、易读、易维护。变量、函数、类和模块的命名应该能够明确传达其用途,而不是使用无意义…...

【Java】Spring Boot项目的创建和使用

文章目录SpringBoot的创建和使用1. 什么是Spring Boot?为什么要学Spring Boot?2. Spring Boot项目的优点3. Spring Boot 项目的创建3.1 使用idea创建3.2 接下来创建Spring Boot项目4. 项目目录介绍和运行4.1 运行项目4.2 输出内容5. 总结SpringBoot的创建…...

Malware Dev 00 - Rust vs C++ 初探

写在最前 如果你是信息安全爱好者,如果你想考一些证书来提升自己的能力,那么欢迎大家来我的 Discord 频道 Northern Bay。邀请链接在这里: https://discord.gg/9XvvuFq9Wb我会提供备考过程中尽可能多的帮助,并分享学习和实践过程…...