前言
前面我们学习了Flask
如何构建一个程序的流程,又研究了它的路由如何设定,还对如何获取模板表单数据进行了梳理,这一篇文章来研究一下如何将Flask
与数据库连接。
在这个系列的第一篇文章中,就已经提到之所以选择Flask
的一个很重要的原因就是它和SQLAlchemy
的对接做得比较好,而Django
的ORM
部分相对封闭了些,再加上之前自己的一个系统中用的也是SQLAlchemy
的缘故。
这里稍插入一点题外话:家里的计算机上安装的是
Lubuntu19.10
,但在安装Mariadb
数据库时,始终提示ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/var/run/mysqld/mysqld.sock’ (2)
这个错误,研究了网上能找得到的方案都无助于解决,前后也完全删除并重装了数次,依旧没有效果,后想起是否可借助tasksel
工具将LAMP
直接安装上去,结果提示LAMP
安装成功,但运行时依然有同样的错误发生,所以无奈之下准备卸载LAMP
,但恰恰就是利用tasksel
来取消勾选框后,卸载是卸载了,可系统重起后始终定于openbox
登录界面无法加载成功,试了数次后,无奈只得用liveCD
备份系统数据,并重新安装,之后直接升级到Lubuntu20.04
版本,再安装Mariadb
,然后运行mysql_secure_installation
,竟然成功了,然而终究是无法知道原版本为何出问题了,鉴于在这个小问题上纠缠了两个小时,颇有些郁闷,故记于此,以期某天能知道是哪里出了故障。
连接数据的准备工作
刚才提到在系统中安装了Mariadb
数据库,这个数据库是mysql
的一个衍生版本,关于两者的恩怨同学们可以去网格上搜索,这里就不再重述了。
通过root
帐号进入数据库中,创建新的数据库:
create database mydb default character set utf8mb4 collate utf8mb4_unicode_ci;
这语句后面的
character
是设定数据库字符集。
准备好数据库后,要安装flask-sqlalchemy
,这是Flask
的一个插件,也相当于Flask
与SQLAlchemy
的一个接口,安装代码如下:
pip3 install flask-sqlalchemy
为了使
Python
能和
mariadb
数据库连接起来,这里用的是
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/mydb?charset=utf8' app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = True db= SQLAlchemy(app)
上述代码中
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = True
这一行如果不添加,程序会报警告。
db=SQLAlchemy(app)
这一句即完成了将Flask
与数据库的连接,所创建的db
就是一个抽象的数据库对象。
下面我们来基于刚才创建的db
对象构造一个User
类:
class User(db.Model): id = db.Column(db.Integer, primary_key = True) name = db.Column(db.String(100)) email = db.Column(db.String(100)) passwd = db.Column(db.String(200)) demo = db.Column(db.String(100)) def __init__(self, name, email, passwd, demo): self.name = name self.email = email self.passwd = passwd self.demo = demo
在上述类中,我们为
User
创建了五个字段,下面可以通过运行一句语句来将上述类映射到数据库中:
db.create_all()
这时我们来
mysql
看看我们创建的表是否存在,如下图所示:
向数据库添加数据
在创建完成后,要开始对数据库进行操作,首先来添加数据,为了用户添加方便,我们需要添加一个用户输入界面,这个可以借鉴之前的用户登录页面设置:
<html> <body> <h3>用户信息录入h3> <hr/> <form action = "{{ request.path }}" method = "post"> <label for = "name">用户名:label> <input type = "text" name = "name" placeholder = "用户名" /><br> <label for = "email">邮 箱:label> <input type = "text" name = "email" placeholder = "" /><br> <label for = "passwd">密 码:label> <input type ="password" name = "passwd" placeholder = "" /><br> <label for = "demo">备 注:label> <textarea name = "demo" placeholder = "">textarea><br> <input type = "submit" value = "添加" /> form> body> html>
这一次我们将表单的
action
直接指向当前路径,这就要求在当前路径所对应的函数中,对
POST
数据进行处理:
@app.route('/newuser/', methods = ['GET', 'POST'])def newuser(): if request.method == 'POST': if request.form['name'] and request.form['email'] and request.form['passwd']: curuser = User(request.form['name'], request.form['email'], request.form['passwd'], request.form['demo']) db.session.add(curuser) db.session.commit() return redirect(url_for('dispAllUser')) return render_template('newuser.html')
如果熟悉
SQLAlchemy
的同学,肯定对
session.add
以及
session.commit
这两个方法很熟悉,在
SQLAlchemy
中,
session
是通过
sessionmake
对
engine
进行绑定后的实例化对象,而在
flask-sqlalchemy
中,这个
session
就直接通过
db
就可以访问,关于
db
的创建在上文中有提及。
注意:上述代码中,url_for()
后面跟的函数必须与实际的函数相对应,而不是和路由一致。
显示的界面如下:
将数据库的数据显示出来
在上述newuser
的路由函数中,当用户添加成功后,会将页面重定向至显示所有用户
页面的函数中,这就需要再来写一个页面,关于这一个可参考上一篇文章中显示所有用户的页面模板:
<html> <head>head> <body> <h3>所有用户信息h3> <h3>新建 (<a href = "{{ url_for('newuser') }}">增加用户a>)h3> <table border="1"> <thead> <tr> <th>姓名th> <th>邮箱th> <th>密码th> <th>备注th> tr> thead> <tbody> {% for user in users %} <tr> <td>{{ user.name }}td> <td>{{ user.email }}td> <td>{{ user.passwd }}td> <td>{{ user.demo }}td> tr> {% endfor %} tbody> table> body>html>
当然,对于显示所有用户信息需要单独用一个路由来实现:
@app.route('/dispalluser/')def dispAllUser(): return render_template('dispalluser.html', users = User.query.all() )
上述代码中,我们向模板增加了一个User
的变量,该变量将数据查询信息传递给模板dispalluser.html
。
显示的结果如下:
在数据库中查询的结果如下:
小结
本文对
Flask
如何连接
mariadb
数据库进行了分析,并实现了一个用户信息的增加和查询功能,在接下来的学习中,我们将对该程序进行更好的完善。