当前位置:   article > 正文

Python Flask实现修改和删除数据_flask session.merge

flask session.merge

Python Flask实现修改和删除数据

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

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

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

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

  1. from flask import Flask, render_template, request, redirect, flash
  2. from flask_sqlalchemy import SQLAlchemy
  3. import random
  4. app = Flask(__name__)
  5. app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://admin:Mysql!123@127.0.0.1:3306/MyDB_one'
  6. app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
  7. app.config['SQLALCHEMY_ECHO'] = True
  8. app.config['SECRET_KEY'] = 'NFAIOSDFHASOGHAOSPIGAOWE'
  9. db = SQLAlchemy(app)
  10. class Phone(db.Model):
  11. __tablename__ = 'Phone_tb'
  12. pid = db.Column(db.Integer, primary_key=True)
  13. name = db.Column(db.String(32))
  14. person_id = db.Column(db.Integer, db.ForeignKey('Person_tb.mid'))
  15. def __repr__(self):
  16. return 'Phone_name: {}'.format(self.name)
  17. class Person(db.Model):
  18. __tablename__ = 'Person_tb'
  19. mid = db.Column(db.Integer, primary_key=True)
  20. name = db.Column(db.String(64), unique=True)
  21. age = db.Column(db.Integer)
  22. phones = db.relationship('Phone', backref='person', lazy='dynamic')
  23. def __repr__(self):
  24. return 'Person_name: {}'.format(self.name)
  25. @app.route('/', methods=['GET', 'POST'])
  26. def index():
  27. if request.method == 'GET':
  28. persons = Person.query.all()
  29. return render_template('update_and_delete.html', persons=persons)
  30. if request.method == 'POST':
  31. person_name = request.form.get('person')
  32. if not person_name:
  33. return redirect('/')
  34. submit = request.form.get('search')
  35. if submit == '查询':
  36. persons = Person.query.filter_by(name=person_name)
  37. return render_template('update_and_delete.html', persons=persons)
  38. submit = request.form.get('add')
  39. if submit == '添加':
  40. phone_name = request.form.get('phone')
  41. person = Person.query.filter_by(name=person_name).first()
  42. if person:
  43. if not phone_name:
  44. return redirect('/')
  45. phone = Phone.query.filter(Phone.name == phone_name, Phone.person_id == person.mid).first()
  46. if phone:
  47. flash('数据已存在!')
  48. else:
  49. phone = Phone(name=phone_name, person_id=person.mid)
  50. add_data(phone)
  51. else:
  52. person = Person(name=person_name, age=random.randint(18, 25))
  53. add_data(person)
  54. if not phone_name:
  55. return redirect('/')
  56. phone = Phone(name=phone_name)
  57. phone.person = person
  58. add_data(phone)
  59. return redirect('/')
  60. def add_data(obj):
  61. try:
  62. db.session.add(obj)
  63. db.session.commit()
  64. except Exception as e:
  65. print(e)
  66. db.session.rollback()
  67. flash("添加失败")
  68. if __name__ == '__main__':
  69. app.run(debug=True)

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

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

二、前端模板文件准备

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

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Person</title>
  6. </head>
  7. <body>
  8. <form method="post">
  9. <label>人名:</label> <input id="person" name="person" type="text" value=""><br/>
  10. <label>手机:</label> <input id="phone" name="phone" type="text" value=""><br/><br/>
  11. <input id="search" name="search" type="submit" value="查询">
  12. <input id="add" name="add" type="submit" value="添加"><br/>
  13. </form>
  14. <br/>
  15. {% for message in get_flashed_messages() %}
  16. {{ message }}
  17. {% endfor %}
  18. <ul>
  19. {% for person in persons %}
  20. <li>{{ person.name }} <a href="/delete_person/{{ person.mid }}">删除</a>
  21. <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>
  22. <ul>
  23. {% for phone in person.phones %}
  24. <li>{{ phone.name }} <a href="/delete_phone/{{ phone.pid }}">删除</a>
  25. <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>
  26. {% else %}
  27. <li></li>
  28. {% endfor %}
  29. </ul>
  30. {% endfor %}
  31. </ul>
  32. </body>
  33. </html>

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

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

三、实现修改人名

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

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

  1. @app.route("/update_person/<id>", methods=['GET', 'POST'])
  2. def update_person(id):
  3. person_name = request.form.get('person_{}'.format(id))
  4. if not person_name:
  5. flash("请输入修改后的人名")
  6. return redirect('/')
  7. person = Person.query.get(id)
  8. if not person:
  9. flash("人名不存在")
  10. else:
  11. person.name = person_name
  12. try:
  13. db.session.merge(person)
  14. db.session.commit()
  15. except Exception as e:
  16. print(e)
  17. db.session.rollback()
  18. return redirect('/')

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

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

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

四、实现修改手机

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

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

  1. @app.route("/update_phone/<id>", methods=['GET', 'POST'])
  2. def update_phone(id):
  3. phone_name = request.form.get('phone_{}'.format(id))
  4. if not phone_name:
  5. flash("请输入修改后的手机")
  6. return redirect('/')
  7. phone = Phone.query.get(id)
  8. if not phone:
  9. flash("手机不存在")
  10. else:
  11. phone.name = phone_name
  12. try:
  13. db.session.merge(phone)
  14. db.session.commit()
  15. except Exception as e:
  16. print(e)
  17. db.session.rollback()
  18. return redirect('/')

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

五、实现删除人名

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

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

  1. @app.route("/delete_person/<id>")
  2. def delete_person(id):
  3. person = Person.query.get(id)
  4. if not person:
  5. flash("人名不存在")
  6. else:
  7. try:
  8. Phone.query.filter(Phone.person_id == person.mid).delete()
  9. db.session.delete(person)
  10. db.session.commit()
  11. except Exception as e:
  12. print(e)
  13. db.session.rollback()
  14. return redirect('/')

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

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

六、实现删除手机

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

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

  1. @app.route("/delete_phone/<id>")
  2. def delete_phone(id):
  3. phone = Phone.query.get(id)
  4. if not phone:
  5. flash("手机不存在")
  6. else:
  7. try:
  8. db.session.delete(phone)
  9. db.session.commit()
  10. except Exception as e:
  11. print(e)
  12. db.session.rollback()
  13. return redirect('/')

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

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

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

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/483366
推荐阅读
相关标签
  

闽ICP备14008679号