Python Flask实现修改和删除数据

上一篇文章写了查询和添加数据,这篇文章继续写修改和删除数据。

查询和添加数据参考: https://blog.csdn.net/weixin_43790276/article/details/103378470

一、数据准备和后端代码准备

继续使用查询和添加数据时的数据表和数据,新建一个 update_and_delete.py 文件,复制查询和添加数据的代码过来,代码如下:

from flask import Flask, render_template, request, redirect, flash
from flask_sqlalchemy import SQLAlchemy
import randomapp = Flask(__name__)app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://admin:Mysql!123@127.0.0.1:3306/MyDB_one'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
app.config['SQLALCHEMY_ECHO'] = True
app.config['SECRET_KEY'] = 'NFAIOSDFHASOGHAOSPIGAOWE'
db = SQLAlchemy(app)class Phone(db.Model):__tablename__ = 'Phone_tb'pid = db.Column(db.Integer, primary_key=True)name = db.Column(db.String(32))person_id = db.Column(db.Integer, db.ForeignKey('Person_tb.mid'))def __repr__(self):return 'Phone_name: {}'.format(self.name)class Person(db.Model):__tablename__ = 'Person_tb'mid = db.Column(db.Integer, primary_key=True)name = db.Column(db.String(64), unique=True)age = db.Column(db.Integer)phones = db.relationship('Phone', backref='person', lazy='dynamic')def __repr__(self):return 'Person_name: {}'.format(self.name)@app.route('/', methods=['GET', 'POST'])
def index():if request.method == 'GET':persons = Person.query.all()return render_template('update_and_delete.html', persons=persons)if request.method == 'POST':person_name = request.form.get('person')if not person_name:return redirect('/')submit = request.form.get('search')if submit == '查询':persons = Person.query.filter_by(name=person_name)return render_template('update_and_delete.html', persons=persons)submit = request.form.get('add')if submit == '添加':phone_name = request.form.get('phone')person = Person.query.filter_by(name=person_name).first()if person:if not phone_name:return redirect('/')phone = Phone.query.filter(Phone.name == phone_name, Phone.person_id == person.mid).first()if phone:flash('数据已存在!')else:phone = Phone(name=phone_name, person_id=person.mid)add_data(phone)else:person = Person(name=person_name, age=random.randint(18, 25))add_data(person)if not phone_name:return redirect('/')phone = Phone(name=phone_name)phone.person = personadd_data(phone)return redirect('/')def add_data(obj):try:db.session.add(obj)db.session.commit()except Exception as e:print(e)db.session.rollback()flash("添加失败")if __name__ == '__main__':app.run(debug=True)

我提前在数据库中创建了数据表和添加数据,上面的代码实现了查询和添加数据。

代码复制过来后,将 render_template() 中返回的模板文件 search_and_add.html 改成 update_and_delete.html 。

二、前端模板文件准备

在模板文件夹 templates 中创建一个 update_and_delete.html 模板文件,复制查询和添加数据时的 HTML 代码过来并进行修改,修改后的代码如下。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Person</title>
</head>
<body>
<form method="post"><label>人名:</label> <input id="person" name="person" type="text" value=""><br/><label>手机:</label> <input id="phone" name="phone" type="text" value=""><br/><br/><input id="search" name="search" type="submit" value="查询"><input id="add" name="add" type="submit" value="添加"><br/>
</form><br/>
{% for message in get_flashed_messages() %}{{ message }}
{% endfor %}<ul>{% for person in persons %}<li>{{ person.name }} <a href="/delete_person/{{ person.mid }}">删除</a><form method="post" action="/update_person/{{ person.mid }}"><input id="person_{{ person.mid }}" name="person_{{ person.mid }}" type="text" value=""> <input id="update_{{ person.mid }}" name="update_{{ person.mid }}" type="submit" value="修改"></form></li><ul>{% for phone in person.phones %}<li>{{ phone.name }} <a href="/delete_phone/{{ phone.pid }}">删除</a><form method="post" action="/update_phone/{{ phone.pid }}"><input id="phone_{{ phone.pid }}" name="phone_{{ phone.pid }}" type="text" value=""> <input id="update_{{ phone.pid }}" name="update_{{ phone.pid }}" type="submit" value="修改"></form></li>{% else %}<li>无</li>{% endfor %}</ul>{% endfor %}
</ul></body>
</html>

这个 HTML 文件写得不好,不过能完成功能。

运行一下后端服务器,访问 http://127.0.0.1:5000/ ,初始的界面如下:

三、实现修改人名

需要实现的功能是:在对应人名下面输入修改后的人名,然后点击“修改”按钮,后端代码对数据库进行修改,然后将结果查询返回首页,展示所有数据。

在查询和添加数据的视图函数下面继续添加修改人名的视图函数。

@app.route("/update_person/<id>", methods=['GET', 'POST'])
def update_person(id):person_name = request.form.get('person_{}'.format(id))if not person_name:flash("请输入修改后的人名")return redirect('/')person = Person.query.get(id)if not person:flash("人名不存在")else:person.name = person_nametry:db.session.merge(person)db.session.commit()except Exception as e:print(e)db.session.rollback()return redirect('/')

修改数据需要提交前端 form 表单中的数据到后端,所以请求方式需要使用 POST。修改数据库中的数据使用数据库会话的 merge() 方法: db.session.merge() 。

需要注意的是,因为人名是唯一字段,如果填一个已经存在的人名,后端不会做任何处理,修改不会成功。

添加代码后,重新运行后端服务器,访问 http://127.0.0.1:5000/ ,开始修改人名,如将 You 改成 Your ,点击“修改”按钮后,界面显示结果如下:

四、实现修改手机

需要实现的功能与人名相似:在对应手机下面输入修改后的手机,然后点击“修改”按钮,后端代码对数据库进行修改,然后将结果查询返回首页,展示所有数据。

继续添加修改手机的视图函数。

@app.route("/update_phone/<id>", methods=['GET', 'POST'])
def update_phone(id):phone_name = request.form.get('phone_{}'.format(id))if not phone_name:flash("请输入修改后的手机")return redirect('/')phone = Phone.query.get(id)if not phone:flash("手机不存在")else:phone.name = phone_nametry:db.session.merge(phone)db.session.commit()except Exception as e:print(e)db.session.rollback()return redirect('/')

添加代码后,重新运行后端服务器,访问 http://127.0.0.1:5000/ ,开始修改手机,如将 Your 下的 VIVO 改成 OPPO ,点击“修改”按钮后,界面显示结果如下:

五、实现删除人名

需要实现的功能是:点击对应人名后面的“删除”标签,会将人名删除。同时,因为人名是父级,手机是子级,所以如果人名下有手机,该人名下的所有手机也全部一起删除。

继续添加删除人名的视图函数。

@app.route("/delete_person/<id>")
def delete_person(id):person = Person.query.get(id)if not person:flash("人名不存在")else:try:Phone.query.filter(Phone.person_id == person.mid).delete()db.session.delete(person)db.session.commit()except Exception as e:print(e)db.session.rollback()return redirect('/')

删除数据可以使用 GET 请求方式完成。删除数据库中的数据使用数据库会话的 delete() 方法:db.session.delete() 。可以根据关系字段查询出 Phone 中对应的关联数据,直接链式调用 delete() 方法删除数据。

添加代码后,重新运行后端服务器,访问 http://127.0.0.1:5000/ ,开始删除人名,如将除 Your 以外的人名全部删除,依次点击其他人名后面的“删除”标签,最终界面显示结果如下:

六、实现删除手机

需要实现的功能是:点击对应手机后面的“删除”标签,会将手机删除。

继续添加删除手机的视图函数。

@app.route("/delete_phone/<id>")
def delete_phone(id):phone = Phone.query.get(id)if not phone:flash("手机不存在")else:try:db.session.delete(phone)db.session.commit()except Exception as e:print(e)db.session.rollback()return redirect('/')

添加代码后,重新运行后端服务器,访问 http://127.0.0.1:5000/ ,开始删除手机,如将 Your 下的 OPPO 删除,点击 OPPO 后面的“删除”标签,删除后界面显示结果如下:

在 update_and_delete.py 中,保留了查询和添加的功能,因为修改和删除数据后需要查询所有数据返回到首页展示。

这里面包含了完整的增删改查,可以反复进行添加、修改、删除来测试功能。

Python Flask实现修改和删除数据相关推荐

  1. Python Flask实现查询和添加数据

    Python Flask实现查询和添加数据 在其他的文章里,我写了 Flask 对数据库进行增删改查的方法,也写了 Flask 将数据返回给前端的方法. 这篇文章,将两者串联起来,实现从前端到数据库的 ...

  2. 数据库(概念、语法、DBMS、SQL语言:创建数据库、表格,添加、修改、删除数据记录)...

    关系型数据库:以表作为实体,以主键和外键关系作为联系的一种数据结构. 主键:在关系型数据库中,用一个唯一的标识符来标志每一行,这个标识符就是主键.主键有两个特点:非空和不能重复. 外键:在关系型数据库 ...

  3. sqlite数据类型、关键词及创建、修改、删除数据表

    //摘自:http://www.cnblogs.com/caizhimin816/articles/1885290.html 谢谢! sqlite数据类型.关键词及创建.修改.删除数据表 Posted ...

  4. vs2010 mysql linq to sql 系列_LINQ to SQL 系列 如何使用LINQ to SQL插入、修改、删除数据...

    LINQ和 LINQ to SQL 都已经不是一个新事物了,但是我接触的比较晚,本着绝知此事要躬行的态度,决定写这个系列. 本文使用的测试环境是VS 2010,和sql server 2005数据库. ...

  5. LINQ to SQL 系列 如何使用LINQ to SQL插入、修改、删除数据

    LINQ和 LINQ to SQL 都已经不是一个新事物了,但是我接触的比较晚,本着绝知此事要躬行的态度,决定写这个系列. 本文使用的测试环境是VS 2010,和sql server 2005数据库. ...

  6. SqlService基础一篇搞定(建库建表、插入数据、修改和删除数据、基础查询、条件查询、模糊查询、聚合函数、分组查询、多表查询)

    SqlService基础知识总汇 前言 一.SQLSERVER建库建表 1.检查数据库名是否存在 2.创建数据库 3.建表 4.修改表结构 5.删除添加约束 二.SQLSERVER插入数据 1.向部门 ...

  7. SQL新增、修改和删除数据

    SQL的新增.修改和删除数据 一.使用INSERT 语句表中添加新行 (1)INSERT语句的基本形式: (2)将显式值插入标识列 (3)INSERT语句的多行插入 (4)INSERT INTO SE ...

  8. sql添加、修改、删除数据,修改删除数据库表。

    在创建完数据库的表格后,接下来要做的显然就是对表格的数据进行编辑了,这篇文章整理了一些关于表格处理的基本方法: 一.添加数据: 在上篇文章中我已经建好了一个t_student的表格,然后往其中添加数据 ...

  9. 使用SQL语句对表进行插入、修改和删除数据操作

    课程名称 MySQL数据库技术 实验 成绩 实验名称 实验三:表数据的插入.修改和删除 学号 辅导老师:陶荣 姓名 班级 日期 实验目的: 1.掌握使用SQL语句对表进行插入.修改和删除数据操作: 2 ...

最新文章

  1. 将TVM集成到PyTorch
  2. linux suse10虚拟机在静态IP局域网中如何设置桥接上网
  3. python使用缩进作为语法边界-重庆铜梁高校邦数据科学通识课【Python基础语法】答案...
  4. JS的indexOf
  5. EClipse开发NDK流程
  6. Concurrent HTTP connections in Node.js
  7. 爬虫-10-响应对象的常用属性
  8. python一个星期可以入门吗_Python一星期入门第6篇: 模块和包
  9. 28岁女博士生被骂“学术媛”,曾以数学建模专业第一名毕业,获牛津数学PhD offer...
  10. ubuntu linux安装ftp,Ubuntu16.04安装vsftpd教程,Linux系统FTP安装
  11. 卡内基梅隆 计算机音乐,卡内基梅隆大学音乐技术专业申请要求
  12. Pollard Rho算法
  13. 商业化广告--体系学习-- 7 -- 行业蓝图篇 --广告产品发展路径
  14. W25qxxx 实现文件系统 ---- 基于RT-thread嵌入式操作系统
  15. 什么是Java?什么是JavaWeb?
  16. 三国志战略版:Daniel_平民福音-“黑科技阵法”三势阵
  17. 降低CSS特异性的策略
  18. K2 工作流_携手捷普:让流程立于云端,臻于至上_全球领先的工作流引擎
  19. 14nm服务器芯片,Intel最后一代14nm服务器平台仍然杳无踪影 全新10nm Ice Lake具体特性一直未公布...
  20. 用python实现NMF降维

热门文章

  1. 神州数码代表亚太及日本区荣膺Riverbed 2017年度最佳分销商
  2. ASP程序密码验证漏洞
  3. 解决Atom插件安装下载问题
  4. C# 自定义类型转换
  5. C++ STL标准模板库(queue)
  6. java的URLConnection
  7. WPF TextBox只能输入数字
  8. Java环境变量CLASSPATH详解(转载)
  9. 云在天之南——我的七天七夜(率性苍山洱海)
  10. [转载](热议)“我不伟大”,但可以让善良“春暖花开”