Python轻量级Web框架Flask(6)——Flask中的单表操作(增删改“查”)

news2025/6/18 1:10:15

0、前言:Python轻量级Web框架Flask(5)中生成的新模板就是包含数据库操作的Flask模板。

  • 在pycharm中用flask写表结构时需用用到数据类型的定义如下:
    在这里插入图片描述
  • 下面总结一些常用到的数据类型:
    在这里插入图片描述
    在这里插入图片描述

1、Python轻量级Web框架Flask(5)中生成的新模板说明:

  • 数据表的表结构一般在models.py当中,如果修改了表结构就要重新进行数据迁移,而表操作(数据表的增删改查)在views.py当中。
  • 在models中的类对应的就是数据库表的表结构,类属性就是表的字段,对应于models中类的对象就是表中的一条数据。

模板修改:

  • 1、将模板中的__init __中的代码修改:
    db_uri = 'mysql+pymysql://root:123456@localhost:3306/flaskdb' # mysql的配置,要记得在mySQL中建一个flaskdb数据库
  • 2、模板中models的代码
# models.py : 模型,数据库

from .exts import db

# 模型Model:类
# 必须继承 db.Model User才能从普通的类变成模型
class User(db.Model):
    # 表名
    __tablename__ = 'user'   # 表名
    # 定义表字段
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String(30), unique=True, index=True)
    age = db.Column(db.Integer, default=1)
  • pycharm专业版配置mysql
    在这里插入图片描述
  • 注意:一定要在电脑的数据库中建一个数据库,之后所有的操作才能开展。学到目前这个阶段,对Flask的理解就是它能够把前端和后端给整合到一起。

2、Flask单表操作——添加/删除/修改:

  • Flask单表的添加/删除/修改操作都是在模板的views中进行的
  • views中代码如下:
# 在views.py中放路由和视图函数

from flask import Blueprint
from .models import * #后面是用views来控制数据库的,所以要在views中导入models文件

# 蓝图
blue = Blueprint('user', __name__)

@blue.route('/')
def index():
    return 'index'


# 单表操作——增加数据:
@blue.route('/useradd/')
def user_add():
    # # 添加一条数据
    # u = User()
    # u.name = 'Heng'
    # u.age = 20
    # db.session.add(u)   # 将u对象添加到session(session是会话,理解为缓存)中
    # db.session.commit() # 同步到数据库中,执行这条命令之后,数据库中的数据才会变

    # 添加多条数据
    users = []
    for i in range(20,31):
        u = User()
        u.name = 'person' + str(i)
        u.age = i
        users.append(u)
    try:
        db.session.add_all(users)
        db.session.commit() # 事务提交
    except Exception as e:
        db.session.rollback()   # 回滚
        db.session.flush()  # 刷新
        return 'add_fail:' + str(e)  # 如果添加多个数据出错,将错误打印出来
    return 'Ok!'

# 单表操作——删除数据:找到要删除的数据删除
@blue.route('/userdel/')
def user_del():
    u = User.query.first()  # 删除之前要查询,这里以删除第一条数据为例
    try:
        db.session.delete(u)
        db.session.commit()
    except Exception as e:
        db.session.rollback()
        db.session.flush()
        return 'del_fail:' + str(e)
    return 'Ok!'

# 单表操作——修改数据:找到要修改的数据修改
@blue.route('/userupdate/')
def user_update():
    u = User.query.first()  # 修改之前要查询,这里以修改第一条数据的名字为例
    try:
        u.name = '王二蛋'
        db.session.commit()
    except Exception as e:
        db.session.rollback()
        db.session.flush()
        return 'del_fail:' + str(e)
    return 'Ok!'

  • 修改完表单之后可以看到结果如下:一种是在workbench中看,一种是在pycharm中看
    在这里插入图片描述
    在这里插入图片描述

3、Flask单表操作——查询:

  • 基础概念预览(在Flask中查询就不用写SQL语句了,它有自己的方法):
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • Flask单表的查询操作是在模板的views中进行的
  • views中代码如下:
# 在views.py中放路由和视图函数

from flask import Blueprint
from sqlalchemy import desc, and_, or_, not_

from .models import * #后面是用views来控制数据库的,所以要在views中导入models文件

# 蓝图
blue = Blueprint('user', __name__)

@blue.route('/')
def index():
    return 'index'

@blue.route('/userget/')
def user_get():
    # all(): 以列表的形式返回所有数据
    users = User.query.all()
    # print(users)    # [王二蛋, person21, person22, person23, person24, person25, person26, person27, person28, person29, person30]
    # print(User,type(User)) #<class 'App.models.User'> <class 'flask_sqlalchemy.model.DefaultMeta'>
    # print(User.query,type(User.query))  # queery是一条sql语句,打印结果如下:
    # SELECT user.id AS user_id, user.name AS user_name, user.age AS user_age FROM user
    #  <class 'flask_sqlalchemy.query.Query'>

    # filter():过滤,得到一个查询集,类似sql中的where
    users = User.query.filter()
    # print(users, type(users))   # 查询集

    # get():查询到对应主键的数据对象(结果是一个对象)
    user = User.query.get(2)
    # print(user, type(user)) # 王二蛋<class 'App.models.User'>
    # print(user.name)    # 王二蛋
    # print(user.age) # 20

    '''
    filter()类似于sql中的where,filter_by()只能用于等值操作(大于小于是没法用的)。
    如果查询数据库中年龄等于25的数据
    '''
    users = User.query.filter(User.age==25)
    # print(list(users))    # [person25]
    users = User.query.filter_by(age=25)
    # print(list(users))  # [person25]

    users = User.query.filter(User.age>25)
    # print(list(users))  # [person26, person27, person28, person29, person30]

    # 只有first()方法,没有last方法
    # print(User.query.first())   # 王二蛋

    # count:统计查询集中的数据有多少条
    # print(User.query.count())   # 11
    # print(User.query.filter(User.age>26).count())   # 4

    # limit():前几条数据
    # offset():跳过前几条数据
    # 跳过前3条数据,取后面的2条:
    # print(list(User.query.offset(3).limit(2)))  # [person23, person24]

    # order_by():排序
    # print(list(User.query.order_by('age'))) # 升序
    # print(list(User.query.order_by(desc('age')))) # 降序(需要导包)

    # 逻辑运算:and_, or_, not_ (需要导包)
    # print(list(User.query.filter(User.age>25,User.age<30))) # [person26, person27, person28, person29]
    # print(list(User.query.filter(and_(User.age>25,User.age<30)))) # [person26, person27, person28, person29]
    # print(list(User.query.filter(or_(User.age>29,User.age<21)))) # [王二蛋, person30]
    # print(list(User.query.filter(not_(and_(User.age>25,User.age<30))))) # [王二蛋, person21, person22, person23, person24, person25, person30]

    # 属性查询contains():查找结果中包含指定内容的数据
    # print(list(User.query.filter(User.name.contains('1')))) # [person21]

    # in_():查找其中之一
    # print(list(User.query.filter(User.age.in_([20,21,30])))) # [王二蛋, person21, person30]

    # startswith():以某个字串开头
    # endswith():以某个字串结尾

    return 'Ok!'


总结:Flask中操作数据库是通过类实现的,这种类继承自“模型”类,这种模型可以理解为数据库,而继承自模型的类对应数据库中的表结构(也就是说创建一个这种类,就是创建了一张新表的结构)。这种类对应的类属性就是表中的字段,根据这种类创建的一个对象,就是表中的一行数据(可以看下上面笔记中的给表中添加一条数据的操作来理解这句话)。

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

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

相关文章

传智健康项目总结

耗时一个半月终于把传智健康项目跟着做完了&#xff0c;下面是对项目的一点心得体会。 项目知识点总结 Maven中parent父工程聚合 聚合模块(父工程)作用&#xff1a;父工程是一个pom工程&#xff0c;通常只是用来帮助其子模块构建的工具&#xff0c;本身并没有实质的内容。具体…

【Pytorch】搭建网络模型的实战

【Pytorch】搭建网络模型的实战CIFAR10 model structure搭建网络使用Sequential进行搭建网络模型使用tensorboard查看网络结构对CIFAR10数据集进行分类&#xff0c;根据图片内容识别这是哪一类 CIFAR10 model structure 输入input:3通道的32 x 32 图片卷积操作的通道数不变 那…

C#,码海拾贝(16)——求“矩阵秩”的全选主元“高斯消去法(Gauss Elimination)”C#源代码,《C#数值计算算法编程》源代码升级改进版

1 矩阵的秩 Rank of Matrix 矩阵的秩是线性代数中的一个概念。在线性代数中&#xff0c;一个矩阵A的列秩是A的线性独立的纵列的极大数&#xff0c;通常表示为r(A)&#xff0c;rk(A)或rank A。 在线性代数中&#xff0c;一个矩阵A的列秩是A的线性独立的纵列的极大数目。类似地&…

全面解析反欺诈(羊毛盾)API,助你识别各类欺诈风险

前言 反欺诈&#xff08;羊毛盾&#xff09;反机器欺诈 API&#xff0c;是一种基于大数据分析和模型产品的技术&#xff0c;通过输入手机号、手机 IP 地址进行检测&#xff0c;帮助客户识别大量存在恶意的账号。 反欺诈&#xff08;羊毛盾&#xff09;API 的作用 反欺诈&…

Spring自定义参数解析器~

1. 什么是参数解析器 RequstBody、RequstParam 这些注解是不是很熟悉&#xff1f; 我们在开发 Controller 接口时经常会用到此类参数注解&#xff0c;那这些注解的作用是什么&#xff1f;我们真的了解吗&#xff1f; 简单来说&#xff0c;这些注解就是帮我们将前端传递的参数…

基于Sikuli GUI图像识别框架的PC客户端自动化测试实践

目录&#xff1a;导读 引言 一、GUI图像识别框架元祖&#xff1a;Sikuli 二、Sikuli运行原理 三、Sikuli安装 四、Sikuli IDE主界面基本使用 五、Sikuli 脚本语法 六、Sikuli 应用示例 七、Sikuli 优势及局限 1.优势 2.局限 Sikuli 使用小结 引言 Sikuli是一种基于…

【Hello Network】网络基础1

作者&#xff1a;小萌新 专栏&#xff1a;网络 作者简介&#xff1a;大二学生 希望能和大家一起进步 本篇博客简介&#xff1a;简单介绍网络的基础概念 网络基础1网络基础网络的起源网络在哪里认识协议网络协议协议分层OSI七层模型TCP/IP协议网络传输流程局域网的两台主机通信两…

跟姥爷深度学习3 神经网络的调试实操

一、前言 前面我们做了一次天气预测的模型&#xff0c;训练的结果都还好&#xff0c;网络好歹是“拟合”了&#xff0c;但预测数据不合预期让我一直耿耿于怀。所以我又花了很长时间来研究为什么&#xff0c;我的理论依据明明没有问题&#xff08;今日*均温度与*一周*均温度具有…

全球6G技术大会总结报告

全球6G技术大会 论坛B&#xff1a;天地融合智能组网技术 论坛D&#xff1a;2030技术发展趋势 论坛E&#xff1a;6G无线空口传输技术 论坛F&#xff1a;6G通感算架构及关键技术 论坛H&#xff1a;6G网络架构及关键技术 论坛B&#xff1a;天地融合智能组网技术 论坛B中包含…

【Java 并发编程】一文了解线程间有哪些通信方式?

一文了解线程间有哪些通信方式&#xff1f;1. synchronized 内置锁2. volatile 关键字3. 等待/通知机制3.1 等待wait()wait(long)wait(long, int)等待方需遵循如下原则3.2 通知notify()notifyAll()通知方需遵循如下原则notify() 和 notifyAll() 应该用谁&#xff1f;4. 管道输入…

第18章_JDK8-17新特性(下)

第18章_JDK8-17新特性&#xff08;下&#xff09; 讲师&#xff1a;尚硅谷-宋红康&#xff08;江湖人称&#xff1a;康师傅&#xff09; 官网&#xff1a;http://www.atguigu.com 6. 新语法结构 新的语法结构&#xff0c;为我们勾勒出了 Java 语法进化的一个趋势&#xff0c…

STM32 库函数 GPIO_SetBits、GPIO_ResetBits、GPIO_WriteBit、GPIO_Write 区别

问题&#xff1a;当我使用STM32库函数对 I/O 口进行赋值时&#xff0c;在头文件中发现有四个相关的函数可以做这个操作&#xff0c;那么它们有什么区别呢&#xff1f; 一、GPIO_SetBits //eg: GPIO_SetBits(GPIOA, GPIO_Pin_1 | GPIO_Pin_2);解释&#xff1a;置位(置1)选择的数…

十、市场活动-分页查询

功能需求 ①、当市场活动主页面加载完成之后,显示所有数据的第一页; ②、用户在市场活动主页面填写查询条件,点击"查询"按钮,显示所有符合条件的数据的第一页&#xff0c;保持每页显示条数不变 ③、实现翻页功能. *在市场活动主页面,显示市场活动列表和记录的总条…

Spring MVC(Boot) Servlet 3.0异步处理,DeferredResult和Callable(续篇)

目录背景意外发现结论背景 上篇Spring MVC(Boot) Servlet 3.0异步处理&#xff0c;DeferredResult和Callable&#xff0c;我把WebMvcConfig 代码加入项目后&#xff0c;会报冲突的问题。如下所示。 requestMappingHandlerMapping: defined by method ‘requestMappingHandlerM…

The 1st Universal Cup Stage 12: ̄Ookayama, April 15-16, 2023 题解

A XOR Tree Path 给一颗树&#xff0c;树上点有黑白两色&#xff0c;每次可以选一个叶子节点&#xff0c;翻转其到根路径上所有点的颜色&#xff0c;问最大黑色点数。 树dp #include<bits/stdc.h> using namespace std; #define MAXN (10000010) #define ll long long…

计及氢能的综合能源优化调度研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

使用国密SSL证书,实现SSL/TLS传输层国密改造

密码是保障网络空间安全可信的核心技术和基础支撑&#xff0c;通过自主可控的国产密码技术保护重要数据的安全&#xff0c;是有效提升我国信息安全保障水平的重要举措。因此&#xff0c;我国高度重视商用密码算法的应用并出台相关政策法规&#xff0c;大力推动国产商用密码算法…

.Net MVC中 视图如何使用路由!!!

配置路由 app.UseEndpoints(endpoints > { endpoints.MapControllerRoute( name: "default", pattern: "{controllerHome}/{actionIndex}/{id?}"); }); 在视图中使用路由 页面跳转常用的路由设置 标签属性 描述 asp-action 指定…

STL容器总结

1.Vector&#xff1a; 本质是动态数组&#xff0c;拥有一段连续的内存空间&#xff0c;并且起始地址不变&#xff0c;能非常好的支持随机存取&#xff0c;即[]操作符&#xff0c;但由于它的内存空间是连续的&#xff0c;所以在中间进行插入和删除会造成内存块的拷贝&#xff0c…

C++之 文件操作(file operation)

目录 引言 一、文本文件 1、写文件 2、读文件 二、二进制文件 1、写文件 2、读文件 引言 程序运行时产生的数据属于临时数据&#xff0c;程序一旦运行结束后&#xff0c;数据也会被释放 通过文件可以将数据保存以持久化 在C中&#xff0c;对文件进行操作要写头文件<f…