Python Flask实现修改和删除数据
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实现修改和删除数据相关推荐
- Python Flask实现查询和添加数据
Python Flask实现查询和添加数据 在其他的文章里,我写了 Flask 对数据库进行增删改查的方法,也写了 Flask 将数据返回给前端的方法. 这篇文章,将两者串联起来,实现从前端到数据库的 ...
- 数据库(概念、语法、DBMS、SQL语言:创建数据库、表格,添加、修改、删除数据记录)...
关系型数据库:以表作为实体,以主键和外键关系作为联系的一种数据结构. 主键:在关系型数据库中,用一个唯一的标识符来标志每一行,这个标识符就是主键.主键有两个特点:非空和不能重复. 外键:在关系型数据库 ...
- sqlite数据类型、关键词及创建、修改、删除数据表
//摘自:http://www.cnblogs.com/caizhimin816/articles/1885290.html 谢谢! sqlite数据类型.关键词及创建.修改.删除数据表 Posted ...
- vs2010 mysql linq to sql 系列_LINQ to SQL 系列 如何使用LINQ to SQL插入、修改、删除数据...
LINQ和 LINQ to SQL 都已经不是一个新事物了,但是我接触的比较晚,本着绝知此事要躬行的态度,决定写这个系列. 本文使用的测试环境是VS 2010,和sql server 2005数据库. ...
- LINQ to SQL 系列 如何使用LINQ to SQL插入、修改、删除数据
LINQ和 LINQ to SQL 都已经不是一个新事物了,但是我接触的比较晚,本着绝知此事要躬行的态度,决定写这个系列. 本文使用的测试环境是VS 2010,和sql server 2005数据库. ...
- SqlService基础一篇搞定(建库建表、插入数据、修改和删除数据、基础查询、条件查询、模糊查询、聚合函数、分组查询、多表查询)
SqlService基础知识总汇 前言 一.SQLSERVER建库建表 1.检查数据库名是否存在 2.创建数据库 3.建表 4.修改表结构 5.删除添加约束 二.SQLSERVER插入数据 1.向部门 ...
- SQL新增、修改和删除数据
SQL的新增.修改和删除数据 一.使用INSERT 语句表中添加新行 (1)INSERT语句的基本形式: (2)将显式值插入标识列 (3)INSERT语句的多行插入 (4)INSERT INTO SE ...
- sql添加、修改、删除数据,修改删除数据库表。
在创建完数据库的表格后,接下来要做的显然就是对表格的数据进行编辑了,这篇文章整理了一些关于表格处理的基本方法: 一.添加数据: 在上篇文章中我已经建好了一个t_student的表格,然后往其中添加数据 ...
- 使用SQL语句对表进行插入、修改和删除数据操作
课程名称 MySQL数据库技术 实验 成绩 实验名称 实验三:表数据的插入.修改和删除 学号 辅导老师:陶荣 姓名 班级 日期 实验目的: 1.掌握使用SQL语句对表进行插入.修改和删除数据操作: 2 ...
最新文章
- 将TVM集成到PyTorch
- linux suse10虚拟机在静态IP局域网中如何设置桥接上网
- python使用缩进作为语法边界-重庆铜梁高校邦数据科学通识课【Python基础语法】答案...
- JS的indexOf
- EClipse开发NDK流程
- Concurrent HTTP connections in Node.js
- 爬虫-10-响应对象的常用属性
- python一个星期可以入门吗_Python一星期入门第6篇: 模块和包
- 28岁女博士生被骂“学术媛”,曾以数学建模专业第一名毕业,获牛津数学PhD offer...
- ubuntu linux安装ftp,Ubuntu16.04安装vsftpd教程,Linux系统FTP安装
- 卡内基梅隆 计算机音乐,卡内基梅隆大学音乐技术专业申请要求
- Pollard Rho算法
- 商业化广告--体系学习-- 7 -- 行业蓝图篇 --广告产品发展路径
- W25qxxx 实现文件系统 ---- 基于RT-thread嵌入式操作系统
- 什么是Java?什么是JavaWeb?
- 三国志战略版:Daniel_平民福音-“黑科技阵法”三势阵
- 降低CSS特异性的策略
- K2 工作流_携手捷普:让流程立于云端,臻于至上_全球领先的工作流引擎
- 14nm服务器芯片,Intel最后一代14nm服务器平台仍然杳无踪影 全新10nm Ice Lake具体特性一直未公布...
- 用python实现NMF降维