> 文章列表 > Python轻量级Web框架Flask(6)——Flask中的单表操作(增删改“查”)

Python轻量级Web框架Flask(6)——Flask中的单表操作(增删改“查”)

Python轻量级Web框架Flask(6)——Flask中的单表操作(增删改“查”)

0、前言:Python轻量级Web框架Flask(5)中生成的新模板就是包含数据操作的Flask模板。

  • 在pycharm中用flask写表结构时需用用到数据类型的定义如下:
    在这里插入图片描述
  • 下面总结一些常用到的数据类型:
    在这里插入图片描述
    在这里插入图片描述

1、Python轻量级Web框架Flask(5)中生成的新模板说明:

  • 数据表的表结构一般在models.py当中,如果修改了表结构就要重新进行数据迁移,而表操作(数据表的增删改查)在views.py当中。
  • 在models中的类对应的就是数据库表的表结构,类属性就是表的字段,对应于models中类的对象就是表中的一条数据。

模板修改:

  • 1、将模板中的__init __中的代码修改:
    db_uri = 'mysql+pymysql://root:123456@localhost:3306/flaskdb' # mysql的配置,要记得在mySQL中建一个flaskdb数据库
  • 2、模板中models的代码
# models.py : 模型,数据库from .exts import db# 模型Model:类
# 必须继承 db.Model User才能从普通的类变成模型
class User(db.Model):# 表名__tablename__ = 'user'   # 表名# 定义表字段id = db.Column(db.Integer, primary_key=True, autoincrement=True)name = db.Column(db.String(30), unique=True, index=True)age = db.Column(db.Integer, default=1)
  • pycharm专业版配置mysql
    在这里插入图片描述
  • 注意:一定要在电脑的数据库中建一个数据库,之后所有的操作才能开展。学到目前这个阶段,对Flask的理解就是它能够把前端和后端给整合到一起。

2、Flask单表操作——添加/删除/修改:

  • Flask单表的添加/删除/修改操作都是在模板的views中进行的
  • views中代码如下:
# 在views.py中放路由和视图函数from flask import Blueprint
from .models import * #后面是用views来控制数据库的,所以要在views中导入models文件# 蓝图
blue = Blueprint('user', __name__)@blue.route('/')
def index():return 'index'# 单表操作——增加数据:
@blue.route('/useradd/')
def user_add():# # 添加一条数据# u = User()# u.name = 'Heng'# u.age = 20# db.session.add(u)   # 将u对象添加到session(session是会话,理解为缓存)中# db.session.commit() # 同步到数据库中,执行这条命令之后,数据库中的数据才会变# 添加多条数据users = []for i in range(20,31):u = User()u.name = 'person' + str(i)u.age = iusers.append(u)try:db.session.add_all(users)db.session.commit() # 事务提交except Exception as e:db.session.rollback()   # 回滚db.session.flush()  # 刷新return 'add_fail:' + str(e)  # 如果添加多个数据出错,将错误打印出来return 'Ok!'# 单表操作——删除数据:找到要删除的数据删除
@blue.route('/userdel/')
def user_del():u = User.query.first()  # 删除之前要查询,这里以删除第一条数据为例try:db.session.delete(u)db.session.commit()except Exception as e:db.session.rollback()db.session.flush()return 'del_fail:' + str(e)return 'Ok!'# 单表操作——修改数据:找到要修改的数据修改
@blue.route('/userupdate/')
def user_update():u = User.query.first()  # 修改之前要查询,这里以修改第一条数据的名字为例try:u.name = '王二蛋'db.session.commit()except Exception as e:db.session.rollback()db.session.flush()return 'del_fail:' + str(e)return 'Ok!'
  • 修改完表单之后可以看到结果如下:一种是在workbench中看,一种是在pycharm中看
    在这里插入图片描述
    在这里插入图片描述

3、Flask单表操作——查询:

  • 基础概念预览(在Flask中查询就不用写SQL语句了,它有自己的方法):
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • Flask单表的查询操作是在模板的views中进行的
  • views中代码如下:
# 在views.py中放路由和视图函数from flask import Blueprint
from sqlalchemy import desc, and_, or_, not_from .models import * #后面是用views来控制数据库的,所以要在views中导入models文件# 蓝图
blue = Blueprint('user', __name__)@blue.route('/')
def index():return 'index'@blue.route('/userget/')
def user_get():# all(): 以列表的形式返回所有数据users = User.query.all()# print(users)    # [王二蛋, person21, person22, person23, person24, person25, person26, person27, person28, person29, person30]# print(User,type(User)) #<class 'App.models.User'> <class 'flask_sqlalchemy.model.DefaultMeta'># print(User.query,type(User.query))  # queery是一条sql语句,打印结果如下:# SELECT user.id AS user_id, user.name AS user_name, user.age AS user_age FROM user#  <class 'flask_sqlalchemy.query.Query'># filter():过滤,得到一个查询集,类似sql中的whereusers = User.query.filter()# print(users, type(users))   # 查询集# get():查询到对应主键的数据对象(结果是一个对象)user = User.query.get(2)# print(user, type(user)) # 王二蛋<class 'App.models.User'># print(user.name)    # 王二蛋# print(user.age) # 20'''filter()类似于sql中的where,filter_by()只能用于等值操作(大于小于是没法用的)。如果查询数据库中年龄等于25的数据'''users = User.query.filter(User.age==25)# print(list(users))    # [person25]users = User.query.filter_by(age=25)# print(list(users))  # [person25]users = User.query.filter(User.age>25)# print(list(users))  # [person26, person27, person28, person29, person30]# 只有first()方法,没有last方法# print(User.query.first())   # 王二蛋# count:统计查询集中的数据有多少条# print(User.query.count())   # 11# print(User.query.filter(User.age>26).count())   # 4# limit():前几条数据# offset():跳过前几条数据# 跳过前3条数据,取后面的2条:# print(list(User.query.offset(3).limit(2)))  # [person23, person24]# order_by():排序# print(list(User.query.order_by('age'))) # 升序# print(list(User.query.order_by(desc('age')))) # 降序(需要导包)# 逻辑运算:and_, or_, not_ (需要导包)# print(list(User.query.filter(User.age>25,User.age<30))) # [person26, person27, person28, person29]# print(list(User.query.filter(and_(User.age>25,User.age<30)))) # [person26, person27, person28, person29]# print(list(User.query.filter(or_(User.age>29,User.age<21)))) # [王二蛋, person30]# print(list(User.query.filter(not_(and_(User.age>25,User.age<30))))) # [王二蛋, person21, person22, person23, person24, person25, person30]# 属性查询contains():查找结果中包含指定内容的数据# print(list(User.query.filter(User.name.contains('1')))) # [person21]# in_():查找其中之一# print(list(User.query.filter(User.age.in_([20,21,30])))) # [王二蛋, person21, person30]# startswith():以某个字串开头# endswith():以某个字串结尾return 'Ok!'

总结:Flask中操作数据库是通过类实现的,这种类继承自“模型”类,这种模型可以理解为数据库,而继承自模型的类对应数据库中的表结构(也就是说创建一个这种类,就是创建了一张新表的结构)。这种类对应的类属性就是表中的字段,根据这种类创建的一个对象,就是表中的一行数据(可以看下上面笔记中的给表中添加一条数据的操作来理解这句话)。