欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Python Web 框架-FLASK day05

程序员文章站 2022-07-02 18:52:00
...

 

目录

 

1.FLASK-SQLALCHEMY - 查询

2.FLASK-SQLALCHEMY - 删除 和 修改

3.FLASK-SQLALCHEMY - 关系映射


day04回顾

1.模型
  使用名为SQLAlchemy的ORM框架,并且需要 Flask-SQLAlchemy
  配置
    from flask_sqlalchemy import SQLAlchemy

    app.config['SQLALCHEMY_DATABASE_URI']='mysql://username:[email protected]:port/dbname'
    app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True

    db = SQLAlchemy(app)
     

  1. 定义模型
    class MODELNAME(db.Model):
        __tablename__ = 'TABLENAME'

      COLUMN_NAME = db.Column(db.TYPE,OPTIONS) 
      ...

 


1.FLASK-SQLALCHEMY - 查询

  1. 基于 db.session 进行查询
    1. db.session.query()
      该函数会返回一个Query对象,类型为 BaseQuery,包含了指定实体类对应的表中所有的数据

      该函数也可以接受多个参数,参数表示的是要查询哪个实体
    2. 查询执行函数
      目的:在查询的基础上得到最终想要的结果
      语法:db.session.query(...).查询执行函数()
      函数 说明
      all() 以列表的方式返回查询的所有结果
      first() 返回查询中的第一个结果,如果没有结果,则返回None
      first_or_404() 返回查询中的第一个结果,如果没有结果,则终止并返回404
      count() 返回查询结果的数量

       

    3. 查询过滤器函数
      作用:在查询的基础山,筛选部分列出来
      语法:db.session.query(...).过滤器函数().查询执行函数()
       

      函数 说明
      filter() 指定条件进行过滤(多表,单表,定值,不定值...)
      filter_by() 按等值条件进行过滤
      limit() 按限制行数获取
      order_by() 根据指定条件进行排序
      group_by 根据指定条件进行分组

      详解:

      1. filter()

        1. 查询年龄 大于30的 Users的信息
          db.session.query(Users).filter(Users.age>30).all()
          注意:条件必须由 模型类.属性 来组成

        2. 查询年龄 大于30且id大于5 的Users的信息
          db.session.query(Users).filter(Users.age>30,Users.id>5).all()

        3. 查询年龄 大于30或id大于5 的Users的信息
          注意:查询 或 的操作,要借助 0r_()
          db.session.query(Users).filter(or_(Users.age>30,Users.id>5)).all()

        4. 查询id等于5的Users的信息
          db.session.query(Users).filter(Users.id==5).first()

        5. 查询email中包含‘w’ 的users的信息 - 模糊查询 like
          db.session.query(Users).filter(Users.email.like('%w%')).all()

        6. 查询id在 [1,2,3] 之间的Users 的信息
          db.session.query(Users).filter(Users.id.in_([1,2,3])).all()

      2. filter_by()

        1. 查询 id=5的Users的信息
          db.session.query(Users).filter_by(id=5).first()

      3. limit()

        1. 在整个查询结果中获取前5条记录
          db.session.query(Users).limit(5).all()

        2. 在整个查询结果中获取第2-5条结果
          db.session.query(Users).limit(3).offset(1).all()

      4. order_by()

        1. 对Users表中所有的数据按id倒序排列
          db.session.query(Users).order_by('id desc').all()

      5. group_by()

        1. db.session.query(Users).group_by('age').all()

  2. 基于 Model 进行查询
    Models.query.查询过滤器(条件参数).查询执行函数

2.FLASK-SQLALCHEMY - 删除 和 修改

  1. 删除
    1. 查询出要删除的实体
      user = db.session.query(Users).filter_by(id=5).first()
    2. 根据所提供的删除方法,将信息删除
      db.session.delete(user)
  2. 修改 
    将id 为1 的用户的username 改为 Wang WC ,年龄改为48

    1. user = Users.query.filter_by(id=1).first()

    2. user.username = 'Wang WC'
      user.age = 48
    3. 保存
      db.session.add(user)

3.FLASK-SQLALCHEMY - 关系映射

  1. 一对多  
    语法实现
     
    1. 在‘多’实体中增加
      外键列名=db.Column(db.Integer,db.ForeignKey('主表.主键'))
    2. 在‘一’实体中增加反向引用关系
      属性名=db.relationship(‘多的实体类名’,backref='属性名',lazy='dynamic')

今日示例:

Run.py

from flask import Flask, render_template, request, redirect
from flask_sqlalchemy import SQLAlchemy

import pymysql
from sqlalchemy import or_

pymysql.install_as_MySQLdb()

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI']="mysql://root:[email protected]:3306/flask"
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN']=True
db = SQLAlchemy(app)

# 根据现有的表结构构建模型类
class Users(db.Model):
    __tablename__ = "users"
    id = db.Column(db.Integer,primary_key=True)
    username = db.Column(db.String(80),unique=True)
    age = db.Column(db.Integer)
    email = db.Column(db.String(120),unique=True)

    def __init__(self,username,age,email):
        self.username = username
        self.age = age
        self.email = email

    def __repr__(self):
        return "<Users %r>" % self.username

class Course(db.Model):
    __tablename__ = "course"
    id = db.Column(db.Integer,primary_key=True)
    cname = db.Column(db.String(30))
    #反向引用:返回与当前课程相关的teacher列表
    #backref:定义反向关系,本质上会向Teacher实体中增加一个course属性.该属性可替代course_id来访问Course模型.此时获得到的是模型对象,而不是外键值
    teachers=db.relationship('Teacher',backref='course')

    def __init__(self,cname):
        self.cname = cname

class Teacher(db.Model):
    __tablename__='teacher'
    id = db.Column(db.Integer,primary_key=True)
    tname = db.Column(db.String(30))
    tage = db.Column(db.Integer)

    # 增加一列 : course_id,外键列,要引用自主键表(course)的主键列(id)
    course_id = db.Column(db.Integer,db.ForeignKey('course.id'))

    def __init__(self,tname,tage):
        self.tname = tname
        self.tage = tage

    def __repr__(self):
        return "<Teacher %r>" % self.tname

db.drop_all()
db.create_all()

@app.route('/insert')
def insert_views():
    user = Users('老魏',40,'[email protected]')
    db.session.add(user)
    return "Insert OK"

@app.route('/query')
def query_views():
    # 测试查询
    # print(db.session.query(Users))
    # print(db.session.query(Users.username,Users.email))
    # print(db.session.query(Users,Course))



    #通过查询执行函数获得最终查询结果
    # all() : 得到查询中所有的结果
    # users = db.session.query(Users).all()
    # for u in users:
    #     print(u.username,u.age,u.email)


    #first() : 得到查询中的第一个结果
    # user = db.session.query(Users).first()
    # print(user.username,user.age,user.email)
    # course = db.session.query(Course).first()
    # print(course)




    # 使用查询过滤器函数对数据进行筛选

    # 查询年龄大于30的Users的信息
    # users = db.session.query(Users).filter(Users.age>30).all()
    # print(users)

    #查询年龄大于30并且id大于5的Users的信息
    # users = db.session.query(Users).filter(Users.age>30,Users.id > 5).all()
    # print(users)

    #查询年龄大于30 或者 id大于 5 的Users的信息
    # users = db.session.query(Users).filter(or_(Users.age>30,Users.id > 5)).all()
    # print(users)

    #查询email中包含字符'w'的用户的信息
    # users = db.session.query(Users).filter(Users.email.like('%w%')).all()
    # print(users)

    #查询id在1,2,3 之间的 用户的信息
    # users = db.session.query(Users).filter(Users.id.in_([1,2,3])).all()
    # print(users)

    #查询 Users 表中所有数据的前3条
    # users = db.session.query(Users).limit(3).all()
    # users = db.session.query(Users).limit(3).offset(1).all()

    # 查询Users表中所有的数据,并按照id倒叙排序
    # users = db.session.query(Users).order_by('id desc,age asc')
    # print(users)

    # 查询Users表中所有的数据,并按照 age 进行分组
    # users = db.session.query(Users).group_by('id').all()
    # print(users)



    # 基于Models实现的查询 : 查询id>3的所有用户的信息
    users = Users.query.filter(Users.id>3).all()
    print(users)
    return "Query OK"

@app.route('/query_all')
def query_all():
    # 查询Users表中所有的数据
    users = db.session.query(Users).all()
    # 将查询结果放到模板中进行显示
    return render_template('01-users.html',params=locals())

# @app.route('/query_by_id/<int:id>')
# def query_by_id(id):
#     user = db.session.query(Users).filter_by(id=id).first()
#     return render_template('02-user.html',params=locals())

@app.route('/query_by_id')
def query_by_id():
    # 接收前端通过地址栏传递过来的查询字符串
    id = request.args.get('id')
    # 根据id获取 user 的信息
    user = db.session.query(Users).filter_by(id=id).first()
    # 将user对象发送的02-user.html模板上进行s显示
    return render_template('02-user.html',params=locals())


@app.route('/delete_user')
def delete_user():
    user = Users.query.filter_by(id=5).first()
    db.session.delete(user)
    return 'Delete OK'

@app.route('/update_user')
def update_user():
    user = Users.query.filter_by(id=1).first()
    user.username = "Wang WC"
    user.age = 40
    db.session.add(user)
    return "Update OK"


@app.route('/delete')
def delete_views():
    # 接收请求过来的id值
    id = request.args.get('id')
    # 根据id值查询出对应的模型对象
    user = Users.query.filter_by(id=id).first()
    # 将模型对象删除
    db.session.delete(user)

    url=request.headers.get('referer','/query_all')
    return redirect(url)


@app.route('/update',methods=['GET','POST'])
def update_views():
    if request.method == 'GET':
        # 获取前端传递过来的 id
        id = request.args.get('id')
        # 根据id查询出对应的实体对象
        user = Users.query.filter_by(id=id).first()
        # 将实体对象放到03-update.html模板中显示
        return render_template('03-update.html',params=locals())
    else:
        #接收前端传递过来的四个参数
        id = request.form['id']
        username = request.form['username']
        age = request.form['age']
        email = request.form['email']
        # 查
        user = Users.query.filter_by(id=id).first()
        # 改
        user.username = username
        user.age = age
        user.email = email
        # 保存
        db.session.add(user)
        return redirect('/query_all')

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

 

01-users.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <table border="1">
        <thead>
            <tr>
                <th>姓名</th>
                <th>年龄</th>
                <th>邮箱</th>
                <th>操作</th>
            </tr>
        </thead>
        <tbody>
            <script>
                /**
                 * 确认是否要删除用户
                 * 参数 id :要删除的用户的id
                 * */
                function deleteUser(id){
                    if(confirm('确定删除吗')){
                        //向服务器端发送请求
                        location.href='/delete?id='+id;
                    }
                } 
            </script>

            {% for u in params.users %}
            <tr>
                <td>
                    <!-- <a href="/query_by_id/{{u.id}}">
                        {{u.username}}
                    </a> -->

                    <a href="/query_by_id?id={{u.id}}">
                        {{u.username}}
                    </a>
                    
                </td>
                <td>{{u.age}}</td>
                <td>{{u.email}}</td>
                <td>
                    <a href="javascript:deleteUser({{u.id}})">删除</a>
                    <a href="/update?id={{u.id}}">修改</a>
                </td>
            </tr>
            {% endfor %}
        </tbody>
    </table>
</body>
</html>

 

02-user.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <div class="container">
        <h3>
            姓名 : {{params.user.username}}
        </h3>
        <h3>
            年龄 : {{params.user.age}}
        </h3>
        <h3>
            邮箱 : {{params.user.email}}
        </h3>
    </div>
</body>
</html>

 

03-update.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form action="/update" method="post">
        <p>
            姓名 : <input type="text" name="username" value="{{params.user.username}}">
            <input type="hidden" name="id" value="{{params.user.id}}">
        </p>

        <p>
            年龄 : <input type="text" name="age" value="{{params.user.age}}">
        </p>

        <p>
            邮箱 : <input type="email" name="email" value="{{params.user.email}}">
        </p>
        <p>
            <input type="submit" value="修改">
        </p>
    </form>
</body>
</html>