Python Flask框架 -- ORM模型的CRUD操作(增删改查)

CRUD操作

使用ORM进行CRUD(Create、Read、Update、Delete)操作,需要先把操作添加到会话中,通过db.session可以获取到会话对象。会话对象只是在内存中,如果想要把会话中的操作提交到数据库中,需要调用db.session.commit()操作,如果想要把会话中的操作回滚,则可以通过db.session.rollback()实现。下面分别对CRUD进行讲解。

1.添加

使用ORM创建一条数据非常简单,先使用ORM模型创建一个对象,然后添加到会话中,再进行commit操作即可,示例代码如下。

# 添加
@app.route('/user/add')
def add_user():
    # 创建 ORM 对象
    user = User(username="宇宙核", password="123456")
    user1 = User(username="张三", password="111111")
    user2 = User(username="李四", password="222222")
    user3 = User(username="王五", password="333333")
    # 将 ORM 对象添加到 db.session 中
    db.session.add(user)
    db.session.add(user1)
    db.session.add(user2)
    db.session.add(user3)
    # 将 db.session 中的改变同步到数据库中
    db.session.commit()
    return "用户添加成功!"

然后打开数据库看看,看到下面那个即添加成功

2.查询

Read操作也就是查询。ORM模型都是继承自db.Model,db.Model内置的query属性上有许多方法,可以实现对ORM模型的查询操作。query上的方法可以分为两大类,分别是过滤方法以及提取方法。示例代码如下。

# 查询
@app.route('/user/query')
def query_user():
    # 1.get查找:根据主键查找,一次只能查一条,这里的主键是id
    # user = User.query.get(1)
    # print(f'{user.id}-{user.username}-{user.password}')
    # return '数据查找成功!'

    # 2.filter_by查找,查找多条数据
    users = User.query.filter_by(username='张三')
    print(type(users)) # 这里得到的users是一个Query类数组,可以用下标来获取数据
    for user in users:
        print(user.username)
    return '数据查找成功!'

3.修改

# 修改
@app.route('/user/update')
def update_user():
    user = User.query.filter_by(username='宇宙核').first()  # .first()拿到第一条数据
    user.password = '666666'
    db.session.commit()
    return "数据修改成功!"

修改前:

   

修改后:

4.删除

# 删除
@app.route('/user/delete')
def delete_user():
    # 1.查找
    user = User.query.get(1)
    # 2.从db.session中删除
    db.session.delete(user)
    # 3.将db.session中的修改同步到数据库中
    db.session.commit()
    return '数据删除成功!'

删除前:

删除后:

app.py 完整代码:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)

# MySQL所在的主机名或域名
HOSTNAME = '127.0.0.1'
# MySQL监听的端口号,默认3306
PORT = 3306
# 连接MySQL的用户名,用自己的
USERNAME = 'root'
# 连接MySQL的密码,用自己的
PASSWORD = '***'
# MySQL上创建的数据库名称
DATABASE = 'database_learn'

app.config[
    'SQLALCHEMY_DATABASE_URI'] = f'mysql+pymysql://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}?charset=utf8mb4'

# 在app.config中设置好连接数据库的信息
# 然后使用SQLAlchemy(app)创建一个db对象
# SQLAlchemy会自动读取app.config中连接数据库的信息
db = SQLAlchemy(app)


class User(db.Model):
    __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()  # 把所有的表同步到数据库中去


@app.route('/')
def hello_world():
    return 'Hello World!'


# 添加
@app.route('/user/add')
def add_user():
    # 创建 ORM 对象
    user = User(username="宇宙核", password="123456")
    user1 = User(username="张三", password="111111")
    user2 = User(username="李四", password="222222")
    user3 = User(username="王五", password="333333")
    # 将 ORM 对象添加到 db.session 中
    db.session.add(user)
    db.session.add(user1)
    db.session.add(user2)
    db.session.add(user3)
    # 将 db.session 中的改变同步到数据库中
    db.session.commit()
    return "用户添加成功!"


# 查询
@app.route('/user/query')
def query_user():
    # 1.get查找:根据主键查找,一次只能查一条,这里的主键是id
    # user = User.query.get(1)
    # print(f'{user.id}-{user.username}-{user.password}')
    # return '数据查找成功!'

    # 2.filter_by查找,查找多条数据
    users = User.query.filter_by(username='张三')
    print(type(users))  # 这里得到的users是一个Query类数组,可以用下标来获取数据
    for user in users:
        print(user.username)
    return '数据查找成功!'


# 修改
@app.route('/user/update')
def update_user():
    user = User.query.filter_by(username='宇宙核').first()  # .first()拿到第一条数据
    user.password = '666666'
    db.session.commit()
    return "数据修改成功!"


# 删除
@app.route('/user/delete')
def delete_user():
    # 1.查找
    user = User.query.get(1)
    # 2.从db.session中删除
    db.session.delete(user)
    # 3.将db.session中的修改同步到数据库中
    db.session.commit()
    return '数据删除成功!'


if __name__ == '__main__':
    app.run()

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Navicat Premium 16中文---数据库管理与开发的强大引擎

Navicat Premium 16是一款功能强大的数据库管理工具,旨在为用户提供高效、便捷的数据库连接、管理和保护体验。该软件支持多种数据库系统,如MySQL、Oracle、SQL Server等,满足用户多样化的需求。通过直观的图形界面,用户可以轻松进…

电脑中msvcp140_codecvt_ids.dll丢失的解决方法,实测有效的方法

在计算机使用过程中,我们经常会遇到一些错误提示,其中最常见的就是缺少某个DLL文件。而msvcp140CODECVTIDS.dll就是其中之一。那么,msvcp140CODECVTIDS.dll是什么?msvcp140CODECVTIDS.dll文件属性又是什么呢?msvcp140C…

探索LLaMA模型:架构创新与Transformer模型的进化之路

引言 在人工智能和自然语言处理领域,预训练语言模型的发展一直在引领着前沿科技的进步。Meta AI(前身为Facebook)在2023年2月推出的LLaMA(Large Language Model Meta AI)模型引起了广泛关注。LLaMA模型以其独特的架构…

C语言例4-3:复合语句,输出a,b的值

代码如下&#xff1a; //复合语句&#xff0c;输出a,b的值 #include<stdio.h> int main(void) {int a 10;printf("a %d\n",a);{int b20; //复合语句printf("b %d\n",b); //复合语句中的数据定义语句放在其他语句的前面}return …

【每日力扣】332. 重新安排行程与51. N 皇后

&#x1f525; 个人主页: 黑洞晓威 &#x1f600;你不必等到非常厉害&#xff0c;才敢开始&#xff0c;你需要开始&#xff0c;才会变的非常厉害。 332. 重新安排行程 给你一份航线列表 tickets &#xff0c;其中 tickets[i] [fromi, toi] 表示飞机出发和降落的机场地点。请你…

急速解决代码扫描Mybatis的SQL注入问题

1.sql注入是什么 sql注入见名知意&#xff0c;是指一些非法用户通过将一些特殊字符或者sql语句插入到要提交的表单之中&#xff0c;从而让服务器在不知情的情况下执行恶意的sql命令&#xff0c;从而引发一系列的安全隐患。 讲的通俗一点就是说&#xff0c;用户利用sql语法将一…

java数据结构与算法刷题-----LeetCode75. 颜色分类

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 文章目录 1. 双指针两次遍历2. 三指针 1. 双指针两次遍历 解题思路&#…

数字化转型能给企业创造哪些价值?

企业数字化转型能创造哪些价值&#xff1f; 深耕TOB行业 9 年&#xff0c;下面来分享下自己的一些经验和看法。 &#xff08;看完要是觉得有用&#xff0c;记得点个赞哈~&#xff09; 1、从宏观上理解&#xff0c;我们可以分成4个大的方面&#xff1a; &#xff08;1&#x…

Linux操作系统及进程(三)进程优先级及特性

目录 一、优先级概念 二、查看系统进程 三、进程切换 一、优先级概念 1.cpu资源分配的先后顺序&#xff0c;就是指进程的优先权&#xff08;priority&#xff09;。 2.优先权高的进程有优先执行权利。配置进程优先权对多任务环境的linux很有用&#xff0c;可以改善系统性能。…

不敢想象吧!Anzo Capital发现不仅经济事件影响汇率天气也是

在投资交易中弄懂汇率的走势方向&#xff0c;对各位投资者的交易盈利那还不是小菜一碟&#xff0c;但各位投资者你们想象不到吧&#xff01;Anzo Capital发现不仅经济事件能影响汇率&#xff0c;就连天气也能轻易影响汇率。 就用2015年1月15日的经济事件来说&#xff0c;当瑞…

【windows】安装 Tomcat 及配置环境变量

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01; &#x1f40b; 希望大家多多支…

「MySQL」数据库约束

&#x1f387;个人主页&#xff1a;Ice_Sugar_7 &#x1f387;所属专栏&#xff1a;数据库 &#x1f387;欢迎点赞收藏加关注哦&#xff01; 数据库约束 &#x1f349;约束类型&#x1f34c;NOT NULL&#x1f34c;UNIQUE&#x1f34c;DEFAULT&#x1f34c;主键&#x1f34c;外键…

python类属性和global变量区别

数据成员是指在类中定义的变量&#xff0c;即属性&#xff0c;根据定义位置&#xff0c;又可以分为类属性和实例属性。 类属性定义在方法前面。 定义类属性&#xff0c;非全局变量 class MyClass:#global cc 10 ## 类属性def my_function(self):global qwqw 9print(this …

【已解决】vue3+ts使用Element-Plus icon图标不显示|element plus 使用 icon 图标教程

文章目录 使用Element-Plus icon图标不显示的解决方案确保已正确安装和引入Element-Plus及其图标库&#xff1a;检查是否有命名冲突&#xff1a; element plus 使用 icon 图标教程1. 安装 Element Plus2. 引入 Element Plus 和图标全局引入按需引入 3. 在组件中使用图标4. 自定…

【包远程运行安装】SpringBoot+Mysql实现的在线音乐播放系统源码+运行教程+开发文档(参考论文)

今天发布的是由【猿来入此】的优秀学员独立做的一个基于springboot脚手架的千千在线音乐播放系统&#xff0c;主要实现了在线音乐的播放和下载&#xff08;支持付费和开通VIP功能&#xff09; 除脚手架功能以外下面是系统的功能&#xff1a; 前台普通用户&#xff1a;注册、登录…

【@changesets/cli】变更集实战教程

一、背景概述 前端目前基于Monorepo架构的npm包开发很普遍&#xff0c;在开发完毕后&#xff0c;我们需要对包进行版本号升级&#xff0c;并且部署&#xff0c;这些操作如果是手动来操作的话&#xff0c;很麻烦&#xff0c;而且容易出错。 例如有这样的场景&#xff1a; -ap…

postgresql多选功能实现

一、背景介绍 在一所乡村小学&#xff0c;教师资源紧张&#xff0c;所以会出现一个教师身兼多职的情况&#xff0c;既是语文老师又是数学老师甚至还是体育老师&#xff0c;这个系统就是为各个班级分配老师&#xff0c;这样一个场景实现 二、代码实现及效果 美术语文英语数学…

qemu+kvm的基本用法

qemukvm的基本用法 1. KVM和QEMU的关系2 QEMU的安装3 使用QEMU3.1 创建虚拟镜像文件3.2 创建虚拟机3.3 使用虚拟机 4 关于kvm用户权限问题 1. KVM和QEMU的关系 首先KVM&#xff08;Kernel Virtual Machine&#xff09;是Linux的一个内核驱动模块&#xff0c;它能够让Linux主机…

【项目】均衡代码评测

TOC 目录 项目介绍 开发环境 主要技术 项目实现 公共模块 日志 工具类 编译运行模块 介绍 编译 运行 编译和运行结合起来 业务逻辑模块 介绍 MVC模式框架 模型&#xff08;Model&#xff09; 视图&#xff08;View) 控制器&#xff08;Controller&#xff09…

【Linux】文件属性信息、文件目录权限修改

Linux文件属性信息 在 Linux 中&#xff0c;ls命令用于列出目录内容&#xff0c;并提供了许多参数以定制输出和显示不同类型的信息。以下是一些常用的ls命令参数 -a显示所有文件和目录&#xff0c;包括以.开头的隐藏文件。-l使用长格式列出文件和目录的详细信息&#xff0c;包…