上一讲,我们学习了 flask 拦截器与session的使用 ,已经清楚了后台用户是否登录的判断及验证 url 合法性的方法 。
本文我们讲解数据库的增删改查操作 , 每一个应用系统都离不开数据的交互 , 数据库的操作是必须掌握的技能 。flask 中使用 flask-sqlalchemy 操作数据库将非常容易 ,我们一起学习一下 。
flask-sqlalchemy 是什么?他有什么特点 ?
flask-sqlalchemy 是一套 flask 的数据库操作框架 。
他的特点是:能够快速的完成数据库的增删改查操作 , 同时还具有的分页查询的功能 ,我们不需要写具体数据库 sql 语句就可完成不同的数据库操作 。
如何一步一步完成数据库增删改查操作呢 ?
1、 创建数据库配置文件,在app.py 同级目录下创建 config.py , 通常我们将数据库的配置写到单独的文件 , 方便数据库配置的修改 。这里我们使用的是 mysql ,每一行配置的作用,我均注释在代码后面,配置如下:
代码语言:txt复制# encoding: utf-8
# dialect driver://username:password@host:port/database
DIALECT = 'mysql' # 要用是什么数据库,我使用的是 mysql
DRIVER = 'pymysql' # 连接数据库驱动,pymysql 是 mysql 的驱动
USERNAME = 'root' # 用户名 ,你的数据库用户名
PASSWORD = 'Wjie2018' # 密码 ,你的数据库密码
HOST = '127.0.0.1' # 服务器 ,数据库所在服务器的ip,本地即 127.0.0.1
PORT = '3306' # 端口 ,数据库的默认端口 3306
DATABASE = 'ideamerry_repair_v3' # 数据库名 ,你需要链接的具体数据库的名字 ,这里是报修数据库的名字
SQLALCHEMY_DATABASE_URI = "{} {}://{}:{}@{}:{}/{}?charset=utf8".format(DIALECT, DRIVER, USERNAME, PASSWORD, HOST, PORT,
DATABASE) # 拼接成数据库的 URI ,一般不需要修改
SQLALCHEMY_TRACK_MODIFICATIONS = False # 用于追踪数据库修改 , 默认为True ,设置为 True 会增加内存消耗
2、创建数据库 db对象:在app.py 同级目录下创建 exts.py文件。
使用 exts.py 的目的是方便在其他文件中使用 db 对象做数据操作。
代码语言:txt复制import os
from flask_sqlalchemy import SQLAlchemy
# 此时先不传入app
db = SQLAlchemy()
3、初始化数据库,我们在启动程序即:app.py 中引入exts.py 和config.py 然后执行数据库初始化操作 。
下面两行代码作用是:导入两个文件
代码语言:txt复制import config
from exts import db
下面两行代码作用是:初始化数据库
代码语言:txt复制app.config.from_object(config) # 加载数据库配置文件
db.init_app(app) # 绑定到我们到应用程序
代码语言:txt复制注意:这两行代码比如放在有数据库操作的蓝图的上面 , 因为蓝图中要使用数据库操作,必须先初始化 ,如果将数据库操作的蓝图放在这两行的上面,就是数据库为初始化不能使用。
蓝图是什么?我们后面讲解。下面这行就是注册一个蓝图 user ,因 user 中有数据库操作,所以下面这行这行必须位于 数据库初始化代码的下面,切记!
# 注册user,使用前缀 user 作为前缀访问
app.register_blueprint(user, url_prefix='/user')
4、创建数据库表的model映射 ,以数据库中 user 表为例 。创建model.py 文件 , 遵循 MVC 思想,我们将创建models目录,然后在models目录下创建 model.py 。
model 中为了映射数据库字段 ,首先要引入数据库 ,从之前我们创建好的exts中引入 db
代码语言:txt复制from exts import db
然后创建用户模型
代码语言:txt复制# 用户模型
class User(db.Model):
tableName = 'user'
id = db.Column(db.INTEGER, primary_key=True, autoincrement=True)
userName = db.Column(db.String(30), nullable=False)
userPassword = db.Column(db.String(30), nullable=False)
openid = db.Column(name='openid', nullable=False)
详细解释上面代码:
第一行表示创建 class 的名字是 User ,参数是数据库model
代码语言:txt复制class User(db.Model):
第二行是数据表的名字,默认情况下 User 类对应数据库中的 user表 ,即将大写字母转换为小写字母的表明。
多个大写字母的 class 类默认会映射数据的表是什么呢 ? 比如 class 的名字是 RepairServiceSheet ,他默认映射的数据库表则是数据库中的 :repair_service_sheet 表。
若不想使用默认的映射呢 ?我们可以覆盖默认的映射 ,使用 tablename来覆盖即可 ,如:你的 User 类要对应数据库中的 sys_user 表,则使用一下代码 :
代码语言:txt复制class User(db.Model):
__tableName__ = 'sys_user'
第三行及以下是具体字段的映射
class 类的 id 映射数据库表 user 的 id 字段,并且是主键自增长 ,primary_key=True, autoincrement=True
代码语言:txt复制 id = db.Column(db.INTEGER, primary_key=True, autoincrement=True)
class 类的 userName 映射数据表的 userName 字段 , 名字必须一模一样,大小写一致 。
代码语言:txt复制 userName = db.Column(db.String(30), nullable=False)
或写为下面形式
代码语言:txt复制 userName = db.Column(name='userName', nullable=False)
如果你不想在 class User 里使用 userName 做为名字 ,则可写为下面形式 :
代码语言:txt复制 anyUserName = db.Column(name='userName', nullable=False)
5、增删改查操作,完成了以上配置 ,数据库操作就非常简单了 ,下面依次看一下。(可参照源代码的controllor/user/user.py中的代码)
增:向用户表添加一条数据
代码语言:txt复制 user = User(userName='admin', userPassword='123456')
db.session.add(user)
db.session.commit()
删:删除用户表中的一条数据
代码语言:txt复制 resultUser = User.query.filter(User.id == 1).first()
db.session.delete(resultUser)
db.session.commit()
改:修改用户表的一条数据 ,先查询出需要修改的记录再做修改提交
代码语言:txt复制 dbUser = User.query.filter(User.id == 1).first() # 先根据 id 查出数据库的一条数据
dbUser.userName='study2100' # 修改用户名admin 为 study2100
db.session.commit() # 提交数据库
查:分页查询用户表数据
代码语言:txt复制 users = User.query.paginate(1, per_page=10) # 分页查询第一页数据,本页查询10条
users = User.query.order_by(User.id.desc()).paginate(page, per_page=10) # order_by 是排序,按照 id 倒叙排列查询
总结:
flask 中数据库的操作并不复杂 , 只要我们按照这样的步骤去做 ,注意细节 ,增删改查操作就可以很快的完成 ,学会了数据库基本操作 , 无论是为小程序端提供 api 接口,还是后台管理功能就能很顺利的完成 。
如你有任何问题 ,请关注我个人公众号 JeenWang 并回复信息,我会为你解答 。祝你们心情愉快,天天进步。