Python Flask实现查询和添加数据

在其他的文章里,我写了 Flask 对数据库进行增删改查的方法,也写了 Flask 将数据返回给前端的方法。

这篇文章,将两者串联起来,实现从前端到数据库的整个过程,通过前端页面查询数据库的数据,从前端向数据库添加数据。

一、创建数据库并添加数据

在项目文件夹下创建一个 search_and_add.py 文件,在里面编写创建数据表和添加数据的代码。

from flask import Flask
from flask_sqlalchemy import SQLAlchemyapp = 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
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)db.drop_all()
db.create_all()if __name__ == '__main__':per_one = Person(name='You', age=18)per_two = Person(name='Me', age=81)per_three = Person(name='JackMa', age=60)per_four = Person(name='Panshiyi', age=50)per_five = Person(name='DingLei', age=40)db.session.add_all([per_one, per_two, per_three, per_four, per_five])phone_one = Phone(name='IPhone', person_id=1)phone_two = Phone(name='Mi', person_id=3)phone_three = Phone(name='NOKIA', person_id=2)phone_four = Phone(name='HUAWEI', person_id=4)phone_five = Phone(name='OPPO', person_id=5)phone_six = Phone(name='VIVO', person_id=1)db.session.add_all([phone_one, phone_two, phone_three, phone_four, phone_five, phone_six])db.session.commit()app.run(debug=True)

代码中使用提前创建好的数据库用户 admin 和提前创建好的数据库 MyDB_one ,连接数据库、创建数据表并在数据表中添加数据。

运行代码后,会在数据库 MyDB_one 中(先删除再)创建两张表 Person_tb 和 Phone_tb ,并分别在两张表中添加5条和6条数据。

添加完初始数据后,将 db.drop_all() ,db.create_all() 和添加数据的代码注释掉,避免重复创建和添加。

二、前端页面准备

在模板文件目录 templates 中创建一个 serach_and_add.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><ul>{% for person in persons %}<li>{{ person.name }}</li><ul>{% for phone in person.phones %}<li>{{ phone.name }}</li>{% else %}<li>无</li>{% endfor %}</ul>{% endfor %}
</ul></body>
</html>

三、实现查询所有数据的功能

访问前端首页时,默认查询出所有 person 和对应的 phone 。

from flask import render_template@app.route('/')
def index():persons = Person.query.all()return render_template('search_and_add.html', persons=persons)

在 search_and_add.py 中创建模型类的后面添加上面的视图函数,查询出 Person 模型类中的所有数据,返回给前端。

因为 Person 和 Phone 是有关系字段的,Person 对 Phone 是一对多的关系,所以通过 Person 中的关系字段可以获取到对应的 Phone 。

运行 search_and_add.py ,访问 http://127.0.0.1:5000/ ,显示效果如下:

四、实现查询部分数据的功能

上面的视图函数默认会查询所有的数据进行展示,现在实现输入人名来查询单条数据。

from flask import render_template, request@app.route('/', methods=['GET', 'POST'])
def index():persons = Person.query.all()if request.method == 'POST':person_name = request.form.get('person')persons = Person.query.filter_by(name=person_name)return render_template('search_and_add.html', persons=persons)

从 Flask 中导入请求上下文 request ,后端通过请求上下文 request 获取前端传入的数据。前端要向后端传递数据,所以请求方式是 POST ,需要修改视图函数支持的请求方式,通过 route 装饰器中的 methods 来设置支持的请求方式。

将视图函数修改成上面的代码,重新运行 search_and_add.py ,访问 http://127.0.0.1:5000/ ,在人名的输入框中输入需要查询的人名,如 You ,然后点击“查询”按钮,运行结果如下:

如果查询的数据不存在,则显示内容为空。

五、实现添加数据的功能

前面是查询数据库中的数据展示在前端页面,现在实现添加数据到后端数据库,并将所有数据一起展示在前端。

from flask import render_template, request, redirect, flash
import random@app.route('/', methods=['GET', 'POST'])
def index():if request.method == 'GET':persons = Person.query.all()return render_template('search_and_add.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('search_and_add.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("添加失败")

从 Flask 中导入了 redirect 方法用于重定向,因为我们添加数据后要把数据全部展示在首页,所以重定向到首页。

导入 flash 方法用于向前端发送提示信息,为了使用 flash ,需要给 app 增加 SECRET_KEY 配置,这个秘钥是一串任意字符串。

app.config['SECRET_KEY'] = 'NFAIOSDFHASOGHAOSPIGAOWE'

并且,要在前端获取 flash 发送的提示信息,需要使用 get_flashed_messages() 方法进行接收,然后将接收到的信息进行展示,所以在模板文件中添加如下代码。

{% for message in get_flashed_messages() %}{{ message }}
{% endfor %}

修改代码后,重新运行 search_and_add.py ,访问 http://127.0.0.1:5000/ ,在人名和手机的输入框中输入需要添加的人名和手机,如 Tayer,IPhone,然后点击“添加”按钮,运行结果如下:

当然,上面的代码中实现了每种情况的添加,如只添加人名不添加手机,添加的人名和手机已存在等,这些都已经包含在上面的代码中了,就不一一演示了。

Python Flask实现查询和添加数据相关推荐

  1. Python Flask实现修改和删除数据

    Python Flask实现修改和删除数据 上一篇文章写了查询和添加数据,这篇文章继续写修改和删除数据. 查询和添加数据参考: https://blog.csdn.net/weixin_4379027 ...

  2. 使用python对mysql数据库进行添加数据的操作

    使用python连接mysql进行添加数据的操作 使用的是python3.6+pymysql 1.导入pymysql,并创建数据库连接 import pymysql# 使用python连接mysql数 ...

  3. 如何使用Python访问和查询Google BigQuery数据

    要使用Python查询Google BigQuery数据,需要将Python客户端连接到BigQuery实例. 将会云客户端库用于Google BigQuery API. 假设您已经设置了Python ...

  4. python 在excel指定列添加数据_python读取excel指定列数据并写入到新的excel方法

    如下所示: #encoding=utf-8 import xlrd from xlwt import * #------------------读数据------------------------- ...

  5. python flask大作业,疫情数据大屏可视化展示

    整体效果 功能描述 本作业从MongoDB取出中国和世界疫情的相关数据进行处理和分析,然后将处理好的数据以Json的形式分别加载到相应的网站,基于ajax异步加载实现轮询,设定每一个小时发起一次请求, ...

  6. python使用matplotlib制作条形图添加数据标签

    在使用matplotlib展示数据的时候,当我们用到条形图的时候南面会遇到一些问题: 水平条形和竖直的条形问题: 解决方法就是更改下函数名,plt.bar()是默认竖直,而plt.barh()是默认水 ...

  7. Statement接口实现查询数据、添加数据

    本文介绍了Statement接口实现查询数据.添加数据.在JDBC的基本应用中,介绍了使用Statement接口查询和添加数据的步骤.重点在于使用getConnection()方法来连接数据库,创建S ...

  8. 使用Python操作Excel图表之 为最后一个数据点添加数据标签

    添加数据标签 是什么 我们咨询了一下new bing,他告诉我们,数据标签是一种用来描述业务实体特征的数据形式.在Excel中,您可以使用数据标签来显示图表中每个数据点的值.例如,在折线图中,您可以在 ...

  9. 在python中将数据库查询数据进行转换为DataFrame格式

    #python中将数据库查询的tuple数据转换为dataframe格式 df = pd.DataFrame(list(result)) print(df) # res 打印结果 6675 5 390 ...

最新文章

  1. 前沿丨DeepMind提出神经元删除法:通过理解每个神经元来理解深度学习
  2. 搜索专题:问题 E: 挑战ACM迷宫
  3. JVM内存GC的骗局
  4. linux mysql卸载_Linux环境搭建
  5. pcb成型板aoi检测_缺陷检测 | PCB AOI质量检测之自动定位核选取算法
  6. 1/2 pymysql:Python连接MySQL数据库
  7. python解析与输出emoji
  8. pandas string funcs
  9. Python风格总结:遍历技巧
  10. 计算机语言分类:机器语言、汇编语言、标记语言、脚本语言、编程语言
  11. 【Java从0到架构师】RocketMQ 基础 - 应用、核心组件、安装
  12. 12.docker inspect
  13. 为什么使用梯度下降法或者梯度上升法
  14. 思科网院Packet Tracer实验(十)
  15. vue 打印 某块内容成pdf
  16. vsto java,VSTO开发入门,C#基础篇
  17. 【项目介绍】单发动机驱动的多旋翼飞行器及其控制系统
  18. java 日期 英文月份_java日期月份转英文格式
  19. pycharm引用pyd文件
  20. RTL8192EU调试信息

热门文章

  1. 如何配置yum源,并安装FTP服务器
  2. linux make使用技巧
  3. 使用 Xtrabackup 在线对MySQL做主从复制【转】
  4. 《HTML5+CSS3网页设计入门必读》——第1章 标记简史1.1 从IETF到W3C:HTML 4的诞生过程...
  5. UNIX-LINUX编程实践教程-第八章-实例代码注解-写一个简单的shell
  6. 80年代出生人坦白十大尴尬事80一代全搜集
  7. VSCode 调试 Egg 完美版 - 进化史 #25
  8. RadonDB - 基于MySQL的云原始分布式数据库,用于构建全局的,可扩展的云服务
  9. 使用PostgREST的RestAPI操作之管理与优化
  10. 容器编排技术 -- Kubernetes Volume