Flask学习笔记(四): Flask与数据库连接

前言

前面我们学习了Flask如何构建一个程序的流程,又研究了它的路由如何设定,还对如何获取模板表单数据进行了梳理,值得一提的就是FlaskSQLAlchemy的对接做得比较好,接下来将研究一下如何将Flask与数据库连接。

创建数据库

在系统中安装mysql数据库,通过root帐号进入数据库中,创建新的数据库studentinfo

 create database studentinfo default character set utf8mb4 collate utf8mb4_unicode_ci;

这语句后面的character是设定数据库字符集。

安装flask-sqlalchemy

flask-sqlalchemy,这是Flask的一个插件,也相当于FlaskSQLAlchemy的一个接口,安装代码如下:

 pip3 install flask-sqlalchemy

安装pymysql

为了使Python能和mysql数据库连接起来,需要安装pymysql

pip3 install pymysql

创建数据表

首先要导入相应的包:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

接着创建与数据库的接口:

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:123456@localhost:3306/studentinfo?charset=utf8'
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = True # 这一行如果不添加,程序会报警告。
db= SQLAlchemy(app)

所创建的db就是一个抽象的数据库对象,db=SQLAlchemy(app)这一句即完成了将Flask与数据库的连接。

db对象构造一个Student类:

class Student(db.Model):id     = db.Column(db.Integer, primary_key = True)name   = db.Column(db.String(100))sex = db.Column(db.String(100))studentId = db.Column(db.String(100))chinese = db.Column(db.String(200))math   = db.Column(db.String(100))english = db.Column(db.String(100))def __init__(self, name, sex, studentId, chinese, math, english): # __init__方法负责对象的初始化self.name = nameself.sex = sexself.studentId = studentIdself.chinese = chineseself.math = mathself.english = english
​
db.create_all() # 将上述类映射到数据库中:
​

这时我们来mysql看看我们创建的表是否存在,进入数据库中输入:describe student

添加数据

在创建数据表完成后,开始对数据库进行操作,首先来添加数据,为了添加方便,我们需要添加一个学生信息添加界面,info.html

<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><title>学生信息</title>
</head>
<body><h1>学生信息添加界面</h1><form action = "{{ request.path }}" method = "post"><p><label for="name">姓名:</label><input type="text" name="name"></p><p><label for="studentId">学号:</label><input type="text" name="studentId"></p><p><label for="sex">性别</label><input type="radio" name="sex" value="男">男<input type="radio" name="sex" value="女">女</p><p><label for="chinese">语文</label><input type="number" name="chinese"></p><p><label for="math">数学</label><input type="number" name="math"></p><p><label for="english">英语</label><input type="number" name="english"></p><input type="submit" name="" value="添加"></form>
</body>
</html>

这一次我们将表单的action直接指向当前路径,这就要求在当前路径所对应的函数中,对POST数据进行处理:

@app.route('/newstudent/', methods = ['GET', 'POST'])
def newstudent():if request.method == 'POST':if request.form['name'] and request.form['studentId'] and request.form['sex'] and request.form['chinese'] and request.form['math'] and request.form['english']:curuser = Student(request.form['name'], request.form['studentId'], request.form['sex'], request.form['chinese'], request.form['math'], request.form['english'])db.session.add(curuser)db.session.commit()return redirect(url_for('AllStudent'))return render_template('info.html')
​

如果学习过SQLAlchemy的同学,应该对session.add以及session.commit这两个方法比较熟悉,在SQLAlchemy中,session是通过sessionmakeengine进行绑定后的实例化对象,而在flask-sqlalchemy中,这个session就直接通过db就可以访问。

添加数据的界面如下:

显示学生数据信息

这里我们需要写一个页面来显示学生信息,在上述newstudent的路由函数中,当添加成功后,页面将会重定向至这个页面函数中:allinfo.html

<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><title>学生信息列表</title>
</head>
<body><h1>学生信息列表</h1><h3>新建 (<a href = "{{ url_for('newstudent') }}">增加学生</a>)</h3><table border="1"><thead><tr><th>姓名</th><th>学号</th><th>性别</th><th>语文</th><th>数学</th><th>英语</th>
​</tr></thead><tbody>{% for student in students %}<tr><td>{{ student.name }}</td><td>{{ student.studentId }} </td><td> {{ student.sex }} </td><td>{{ student.chinese }} </td><td> {{ student.math }} </td><td>{{ student.english }} </td></tr>{% endfor %}
​</tbody></table>
</body>
</html>

添加一个路由:

@app.route('/allstudent/')
def AllStudent():return render_template('allinfo.html', students = Student.query.all() )

上述代码中,我们向模板增加了一个Student的变量,该变量将数据查询信息传递给模板allinfo.html

显示的结果如下:

在数据库中输入select * from student查询学生信息:

可以看到,数据已经存入数据库中。

修改数据和删除数据

所有学生信息是以表格的形式呈现的,现在其最后一列插入修改和删除的链接,要注意,这个链接我们是用url_for来实现的,因为每个学生信息的id唯一,因此无论修改还是删除,都需要将学生信息的id放在url_for的参数中进行传递,同时要注意,采用url_for进行参数传输时,是进行GET提交,所以在相应的路由中,要加入GETPOST方法,allinfo.html修改如下:

<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><title>学生信息列表</title>
</head>
<body><h1>学生信息列表</h1><h3>新建 (<a href = "{{ url_for('newstudent') }}">增加学生</a>)</h3><table border="1"><thead><tr><th>姓名</th><th>学号</th><th>性别</th><th>语文</th><th>数学</th><th>英语</th><th>操作</th>
​</tr></thead><tbody>{% for student in students %}<tr><td>{{ student.name }}</td><td>{{ student.studentId }} </td><td> {{ student.sex }} </td><td>{{ student.chinese }} </td><td> {{ student.math }} </td><td>{{ student.english }} </td><td><a href = "{{ url_for('modifystudent', studentid=student.id) }}">修改</a>&nbsp;&nbsp;<a href = "{{ url_for('deletestudent', studentid=student.id) }}">删除</a></td>
​</tr>{% endfor %}
​</tbody></table>
</body>
</html>

添加相应的路由

上述模板中插入的两个链接中有两个函数被url_for当做参数来做路由,一个是modifystudent,一个是deletestudent,这两个函数都带有参数studentid

modifystudent模块:

@app.route('/modifystudent/<studentid>/', methods = ['GET', 'POST'])
def modifystudent(studentid):curuser = db.session.query(Student).filter_by(id=studentid).one()if request.method == 'POST':if request.form['studentId'] and request.form['sex'] and request.form['chinese'] and  request.form['math'] and request.form['english']:curuser.studentId   = request.form['studentId']curuser.sex = request.form['sex']curuser.chinese = request.form['chinese']curuser.math = request.form['math']curuser.english = request.form['english']db.session.commit()return redirect(url_for('AllStudent'))return render_template('modifyinfo.html', curuser=curuser)

deletestudent模块:

@app.route('/deleteuser/<studentid>/')
def deletestudent(studentid):db.session.query(Student).filter_by(id=studentid).delete()db.session.commit()return redirect(url_for('AllStudent'))

测试

运行一下项目,然后访问一下:

这里可以看到,已经有了修改和删除操作,下面进行测试:

小结

本文实现了flask连接数据库,并且实现了一个简单的学生信息管理操作。

Flask学习笔记(一)

Flask学习笔记(二)

Flask学习笔记(三)

Flask学习笔记(四): Flask与数据库连接相关推荐

  1. Flask学习笔记(四):基于Flask网页显示图片

    原图如下 代码如下 from flask import Flask, request, make_response from datetime import datetime import osapp ...

  2. 【flask学习笔记】flask与HTTP,flask与mongodb交互,用手机输入局域网ip访问flask界面

    文章目录 引入(关于http) flask项目的配置 引入(关于http) 当我们在浏览器中的地址栏中输入这个URL,然后按下Enter时,稍等片刻,浏览器会显示一个问候页面.这背后有一个程序运行着. ...

  3. Flask学习笔记总结(一)

    Flask学习笔记总结(一) 说明:开始在csdn上面记录一些关于自己学习技术的笔记总结. 文章目录 Flask学习笔记总结(一) 前言 一.python的web三大框架 二.flask入门 1.ws ...

  4. 千锋Flask学习笔记

    千锋Flask学习笔记 文章目录 千锋Flask学习笔记 写在前面 1. Flask介绍 2. Views 3. Request 4. Response 5. 会话技术 6. 模型和模板 7. 数据传 ...

  5. C#可扩展编程之MEF学习笔记(四):见证奇迹的时刻

    前面三篇讲了MEF的基础和基本到导入导出方法,下面就是见证MEF真正魅力所在的时刻.如果没有看过前面的文章,请到我的博客首页查看. 前面我们都是在一个项目中写了一个类来测试的,但实际开发中,我们往往要 ...

  6. IOS学习笔记(四)之UITextField和UITextView控件学习

    IOS学习笔记(四)之UITextField和UITextView控件学习(博客地址:http://blog.csdn.net/developer_jiangqq) Author:hmjiangqq ...

  7. RabbitMQ学习笔记四:RabbitMQ命令(附疑难问题解决)

    RabbitMQ学习笔记四:RabbitMQ命令(附疑难问题解决) 参考文章: (1)RabbitMQ学习笔记四:RabbitMQ命令(附疑难问题解决) (2)https://www.cnblogs. ...

  8. JSP学习笔记(四十九):抛弃POI,使用iText生成Word文档

    POI操作excel的确很优秀,操作word的功能却不敢令人恭维.我们可以利用iText生成rtf文档,扩展名使用doc即可. 使用iText生成rtf,除了iText的包外,还需要额外的一个支持rt ...

  9. Ethernet/IP 学习笔记四

    Ethernet/IP 学习笔记四 EtherNet/IP Quick Start for Vendors Handbook (PUB213R0): https://www.odva.org/Port ...

最新文章

  1. python redis 消息队列_python中利用redis构建任务队列(queue)
  2. python基础一循环
  3. 非递归遍历N-ary树Java实现
  4. java大整数的加减乘除_关于大整数的加减乘除求余运算 java
  5. 我计划搞直播了,欢迎来一起聊一聊
  6. C语言课后习题(11)
  7. Flask-SQLAlchemy一般方法总结
  8. Spring-context-ApplicationEvent/ApplicationListener/ApplicationEventMulticaster
  9. Apache编译注释(二)
  10. lodop打印控件——前端学习笔记
  11. linux查看445端口状态,linux和Windows如何查看端口占用情况
  12. 辽宁大连最好的计算机大学排名,2020年大连市最好大学排行榜:20所高校上榜,东北财经大学居第二...
  13. Android开机自启动服务的写法
  14. 黄河中下游地区精化似大地水准面研究与实施
  15. H5直播之MSE(Media Source Extensions)
  16. 使用3ds Max2022来制作简单的动漫头像
  17. Linux常用命令——nethogs命令
  18. Visual Studio(VS)的各个版本下载及安装
  19. opencv4.5.3学习——开发环境搭建
  20. 【转】移动电子商务的现状与问题

热门文章

  1. seo推广绩效考核指标是什么(新媒体运营的绩效考核指标)
  2. 字符串中大小写转换输出
  3. 小白兔写话_一年级小白兔看图写话
  4. HTML5新特性小结
  5. 04-0002 PCA算法
  6. gif一键抠图 在线_手机一键抠图去背景||电脑抽奖软件
  7. JOOQ初学-简单的增删改查demo
  8. 计算机类中文核心期刊目录
  9. PCI总线---PCI设备扫描过程
  10. ios中在app应用内刷新小组件数据