Python轻量级Web框架Flask(6)——Flask中的MySQL单表操作(增删改“查”)/单表操作的应用项目(翻页)

0、前言:

  • Python轻量级Web框架Flask(5)中生成的新模板就是包含数据库操作的Flask模板。
  • 在之前介绍了Flask中的“数据迁移”,其实就是把写在Flask中的模型导入到数据库中变成数据库表,具体数据库表中的增删改查怎么操作,就是这一篇文章讲解的内容了。
  • ★注意:你的新项目如果已经用“数据迁移”生成了对应的表,那你就可以直接对表增删改查,否则要先“数据迁移”!!!
  • 注意这篇文章是通过MySQL实现数据迁移的,MySQL数据迁移之前需要在MySQL中建立一个对应的数据库才行(数据库连接在init中设置好就行了,与MySQL连接一致就行,在MySQL中新建数据库的流程就是进入MySQL,通过某个连接进入,然后新建数据库就好了)
  • 在pycharm中用flask写表结构时需用用到数据类型的定义如下:
    在这里插入图片描述
  • 下面总结一些常用到的数据类型:
    在这里插入图片描述
    在这里插入图片描述

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

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

2、Flask连接MySQL时的模板修改:

  • 1、如果项目用到的数据库是mySQL,就要将模板中的__init __中的db_url的代码修改如下:
    db_uri = 'mysql+pymysql://root:123456@localhost:3306/flaskdb' # mysql的配置,要记得在mySQL中建一个flaskdb数据库

注意:上面mysql配置中最后用到的数据库名称是flaskdb,所以应该在电脑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)
    age = db.Column(db.Integer, default=1)
  • 然后在pycharm终端进行数据迁移指令
  • pycharm专业版配置mysql
    在这里插入图片描述
  • 注意1:一定要在电脑的数据库中建一个数据库,之后所有的操作才能开展。学到目前这个阶段,对Flask的理解就是它能够把前端和后端给整合到一起。
  • 注意2:在pycharm中配置数据库的时候,除了写连接的名字,也要加上数据库名称,否则就有可能会找连接路径下默认的数据库,不是我们想要的结果!
  • 从python侧边栏看数据库的效果如下:这就是相当于在pycharm中集成了一个数据库可视化工具,在workbench中看也是一样的。
    在这里插入图片描述

3、Flask的MySQL单表操作——查询:因为在mySQL中删和改的前提是查,所以要先掌握查。

  • 基础概念预览(在Flask中查询就不用写SQL语句了,它有自己的方法):一般都是主键查询,用get多一些,或者就是用filter做条件查询多一些。
    在这里插入图片描述
  • 下面的查询属性,可以实现一些比较快速的查找方式。
    在这里插入图片描述
    在这里插入图片描述
  • Flask单表的查询操作是在模板的views中进行的,既然是写在views(视图函数)中的,所以要实现对应功能,就要通过运行项目,在网页中调用url路径激活对应的视图函数!
  • 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中的where
    users = 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!'

4、Flask的MySQL单表操作——添加/删除/修改:

  • 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 = i
        users.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中看
    在这里插入图片描述
    在这里插入图片描述

5、翻页项目(单表操作的应用)说明

  • 1、本文中paginate分页的目的:把数据库中所有数据,通过设定“显示页数”、“每页显示的数据数量”,逐条显示在前端页面,具体如下所示:
    在这里插入图片描述

5.1、使用paginate实现分页:

  • 基础指令(新建对象)
    在这里插入图片描述
  • User是定义在Flask应用中的模型,表示数据库中的用户表;paginate是一个用于分页查询的方法,它返回一个Pagination对象,该对象包含当前页的数据,总页数,每页的数据量等信息;参数page表示页码,参数per_page表示每一页的数据量。error_out设置为False时,当发生请求页码超出范围时,不会抛出404错误,只会返回一个空页面。
  • paginate对象基础指令(使用对象属性)
    在这里插入图片描述
    paginate对象基础指令当中常用的属性有:item,通过item获取页面所有数据,再通过“.”加字段名的方式获取每条数据对应字段。pages获取分页之后的总页数,由此设定页面有多少个分页按钮。
    在这里插入图片描述

5.2、项目概览

在这里插入图片描述

  • 说明:在static静态文件中存放了CSS样式是bootstrap中下载的样式,在template中存放了本项目的翻页功能展示页面paginate.html,在该页面通过翻页,实现了将数据库中数据展示的基本功能。
  • 数据库是通过mySQL新建的,然后通过数据迁移,通过项目给数据库添加了11条数据,具体如下:
    在这里插入图片描述

5.3、项目代码

  • paginate.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="../static/CSS/bootstrap.css">
</head>
<body>
    <div class="container">
        <h2>分页功能</h2>
        <hr>
        {#  通过模板语言实现数据展示  #}
        <ul class="list-group">
            {% for item in p.items %}
                <li class="list-group-item">{{ item.name }}</li>
            {% endfor %}
        </ul>
        <hr>
        {#  通过模板语言实现页码展示  #}
        <ul class="pagination">
            {% for foo in range(p.pages) %}
                <li class="page-item"><a class="page-link" href="/paginate/?page={{ foo + 1 }}&per_page=5">{{ foo + 1 }}</a></li>
            {% endfor %}
        </ul>
    </div>
</body>
</html>
  • __ init__.py
# __init__.py : 初始化文件,创建Flask应用
from flask import Flask
from .views import blue
from .exts import init_exts

def creat_app():
    app = Flask(__name__)

    # 注册蓝图(将views中的蓝图和对应app绑定,可能会存在有多个app的情况)
    # 蓝图就是为了便于模块化管理和拓展应用,蓝图会给每个url加上前缀
    app.register_blueprint(blueprint=blue)

    # 配置数据库(配置不同数据库软件,就要用不同配置,配置的目的,就是在用到数据库的时候让项目知道找什么数据库,去哪找数据库)
    # db_uri = 'sqlite:///sqlite3.db'
    db_uri = 'mysql+pymysql://root:123456@localhost:3306/flaskdb' # mysql的配置
    app.config['SQLALCHEMY_DATABASE_URI'] = db_uri
    app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False  # 禁止对象追踪修改(为了不浪费服务器资源进行的设置)

    # 初始化插件
    init_exts(app=app)

    return app
  • exts.py
from flask_sqlalchemy import SQLAlchemy # orm技术
from flask_migrate import Migrate # 数据迁移技术

db = SQLAlchemy()
migrate = Migrate()

def init_exts(app):
    db.init_app(app=app)
    migrate.init_app(app=app, db=db)
  • models.py
# models.py : 模型,数据库
'''
    模型      ===      数据库
    类        ——>     表结构
    类属性     ——>    表字段
    一个对象   ——>    表的一行数据
'''


from .exts import db # 导入db对象就能通过python实现ORM技术,避免了写SQL语句。

# 模型Model:类
# 必须继承 db.Model User才能从普通的类变成模型
class User(db.Model):
    # 表名
    __tablename__ = 'tb_user'   # 数据迁移就是让模型变成表,ORM就是让类变成模型
    # 定义表字段
    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)
    # 通过orm技术得到的db,就是用于替代数据库,后面用到数据库相关操作,可以检索。
  • views.py
# 在views.py中放路由和视图函数

from flask import Blueprint, render_template, request
from .models import * #后面是用views来控制数据库的,所以要在views中导入models文件

# 蓝图(蓝图可以有多个,方便对路径进行区分)
blue = Blueprint('user', __name__)

@blue.route('/')
def index():
    return '这是Flask翻页项目'

# 往数据表中添加数据
@blue.route('/mysql_add')
def mysql_add():
    # 添加多条数据是通过列表实现的,就是将多个对象放到列表当中,将列表提交给数据库
    users = []
    for i in range(20, 31):
        u = User()
        u.name = 'person' + str(i)
        u.age = i
        users.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!'

# paaginate对象
@blue.route('/paginate/')
def get_paginate():
    # page:页码
    page = int(request.args.get('page',1))
    # perpage:每一页显示的数据量
    per_page = int(request.args.get('per_page', 5))

    # paginte
    p = User.query.paginate(page=page, per_page=per_page, error_out=False)
    # print(p.items) # [<User 1>, <User 2>, <User 3>, <User 4>, <User 5>]
    # print(p.pages) # 3(表示总页数)
    # print(p.total) # 11(表示记录数)
    print(p.items[0].name)  # person20

    return render_template('paginate.html', p=p)
  • app.py
# Flask翻页项目
from App import creat_app

app = creat_app()

if __name__ == '__main__':
    app.run(debug=True)

5.4、说明:

  • 项目中用到了bootstrap中的CSS组件bootstrap.css,可自己在bootstrap官网下载。
  • 翻页功能就是一种单表操作的应用

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

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值