美文网首页
Day18-flask3

Day18-flask3

作者: 晓晓的忍儿 | 来源:发表于2018-10-10 18:50 被阅读0次

1. 对学生数据进行CRUD操作

语法:

类名.query.xxx

获取查询集:

all()

filter(类名.属性名==xxx)

filter_by(属性名=xxx)

数据操作:

在事务中处理,数据插入

db.session.add(object)

db.session.add_all(list[object])

db.session.delete(object)

db.session.commit()

修改和删除基于查询

1.1 想学生表中添加数据

@blue.route('/createstu/')
def create_stu():

    s = Student()
    s.s_name = '小花%d' % random.randrange(100)
    s.s_age = '%d' % random.randrange(30)

    db.session.add(s)
    db.session.commit()

    return '添加成功'

提交事务,使用commit提交我们的添加数据的操作

1.2 获取所有学生信息

将学生的全部信息获取到,并且返回给页面,在页面中使用for循环去解析即可

@blue.route("/getstudents/")
def get_students():
    students = Student.query.all()
    return render_template("StudentList.html", students=students)

1.3 获取s_id=1的学生的信息

写法1:

students = Student.query.filter(Student.s_id==1)

写法2:

students = Student.query.filter_by(s_id=2)

注意:filter中可以接多个过滤条件

写法3:

sql = 'select * from student where s_id=1'
students = db.session.execute(sql)

1.4 修改学生的信息

写法1:

students = Student.query.filter_by(s_id=3).first()
students.s_name = '哈哈'
db.session.commit()

写法2:

Student.query.filter_by(s_id=3).update({'s_name':'娃哈哈'})

db.session.commit()

1.5 删除一个学生的信息

写法1:

students = Student.query.filter_by(s_id=2).first()
db.session.delete(students)
db.session.commit()

写法2:

students = Student.query.filter_by(s_id=1).all()
db.session.delete(students[0])
db.session.commit()

注意:filter_by后的结果是一个list的结果集

重点注意:在增删改中如果不commit的话,数据库中的数据并不会更新,只会修改本地缓存中的数据,所以一定需要db.session.commit()

2. 深入数据库增删改查

定义模型,并定义初始化的函数:

class Student(db.Model):

    s_id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    s_name = db.Column(db.String(16), unique=True)
    s_age = db.Column(db.Integer, default=1)

    __tablename__ = "student"

    def __init__(self, name, age):
        self.s_name = name
        self.s_age = age

2.1 增--批量增加

第一种方式:

@blue.route('/createstus/')
def create_users():
    stus = []
    for i in range(5):
        # 实例化Student的对象
        s = Student()
        # 对象的属性赋值
        s.s_name = '张三%s' % random.randrange(10000)
        s.s_age = '%d' % random.randrange(100)
        stus.append(s)
    # 添加需要创建的数据
    db.session.add_all(stus)
    # 提交事务到数据库
    db.session.commit()

    return '创建成功'

注:在创建单条数据的时候使用db.session.add(),在创建多条数据的时候使用db.session.add_all()

第二种方式:

@blue.route('/createstus/')
def create_users():
    stus = []
    for i in range(5):
        # 使用类的初始化去创建Student对象
        s = Student('张三%s' % random.randrange(10000),
                    '%d' % random.randrange(100))
        stus.append(s)

    db.session.add_all(stus)
    db.session.commit()

    return '创建成功'

2.2 查--使用运算符

获取查询集

filter(类名.属性名.运算符(‘xxx’))

filter(类名.属性 数学运算符  值)

运算符:

contains: 包含
startswith:以什么开始
endswith:以什么结束
in_:在范围内
like:模糊
__gt__: 大于
__ge__:大于等于
__lt__:小于
__le__:小于等于

逻辑运算:

与
    and_
    filter(and_(条件),条件…)

或
    or_
    filter(or_(条件),条件…)

非
    not_
    filter(not_(条件),条件…)

例子1:

  1. 查询学生的id为3,4,5,6,16的的学生信息,使用in_逻辑运算

     @blue.route('/getstubyids/')
     def get_stu_by_ids():
    
        students = Student.query.filter(Student.s_id.in_([3,4,5,6,16]))
        return render_template('StudentList.html', students=students)
    
    
  2. 查询学生的年龄小于18岁的学生的信息

     Student.query.filter(Student.s_age < 18)
    
    
  3. 查询学生的年龄小于18岁的学生的信息,lt小于

     students = Student.query.filter(Student.s_age.__lt__(15))
    
    
  4. 查询学生的年龄小于等于18岁的学生的信息,le小于等于

     students = Student.query.filter(Student.s_age.__le__(15))
    
    
  5. 查询学生的姓名以什么开始或者以什么结尾的学生的信息startswith和endswith

     students = Student.query.filter(Student.s_name.startswith('张'))
     students = Student.query.filter(Student.s_name.endswith('2'))
    
    
  6. 查询id=4的学生的信息

     Student.query.get(4)
     获取的结果是学生的对象
    
    
  7. 模糊搜索like

     %:代表一个或者多个
     _:代表一个
    
     Student.query.filter(Student.s_name.like('%张%')) 
    
    

例子:

查询

from sqlalchemy import and_, or_, not_

查询多个条件

stus = Student.query.filter(Student.s_age==18, Student.s_name=='雅典娜')

and_ 并且条件

stus = Student.query.filter(and_(Student.s_age==18, Student.s_name=='雅典娜'))

or_ 或者条件

stus = Student.query.filter(or_(Student.s_age==18, Student.s_name=='火神'))

not_ 非

stus = Student.query.filter(not_(Student.s_age==18), Student.s_name=='火神')

查询姓名不包含'可爱‘,并且年龄不等于12的学生

stus = Student.query.filter(not_(Student.s_name.contains('可爱')), not_(Student.s_age == 12))

manage.py

import redis
from flask import Flask
from flask_script import Manager
from flask_session import Session

from users.models import db
from users.views import uesrs_blue

app=Flask(__name__)
# 蓝图、设置前缀
app.register_blueprint(blueprint=uesrs_blue,url_prefix='/users')

# 设置秘钥
app.config['SECRET_KEY']='123'
# 数据库设置

app.config['SQLALCHEMY_DATABASE_URI']='mysql+pymysql://root:123456@127.0.0.1:3306/flask5'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS']=False

# 绑定数据库
db.init_app(app)

# manager
manager=Manager(app=app)

if __name__=='__main__':
    manager.run()

users->views.py

from flask import Blueprint, render_template, request, redirect, url_for
from sqlalchemy import or_, not_

from users.models import Students, db

uesrs_blue=Blueprint('users',__name__)


# @uesrs_blue.route('/register/',methods=['GET','POST'])
# def register():
#     if request.method=='GET':
#         return render_template('register.html')
#     if request.method=='POST':
#         pass
@uesrs_blue.route('/create_table/')
def create_table():
    # 用于初次创建模型
    db.create_all()
    return "创建成功"


@uesrs_blue.route('/drop_table/')
def drop_table():
    db.drop_all()
    return "删除成功"


@uesrs_blue.route('/add_students/',methods=['GET','POST'])
def add_students():
    if request.method=='GET':
        return render_template('students.html')
    if request.method=='POST':
        name=request.form.get('name')
        age=int(request.form.get('age'))
        # 单个创建
        stu=Students()
        stu.s_name=name
        stu.s_age=age
        stu.save()
        return '添加学生成功'


@uesrs_blue.route('/add_all_students/')
def add_all_students():
    # 批量创建 add_all()
    names=['小王','小图','小坑','小进','老金','小人','小建','小国','老刘']
    stu_list=[]
    for name in names:
        stu=Students()
        stu.s_name=name
        stu_list.append(stu)
    db.session.add_all(stu_list)
    db.session.commit()
    return '批量创建成功'


@uesrs_blue.route('/select_students/')
def select_students():
    # 方法一:
    stu=Students.query.filter(Students.s_name=='小王')
    stu=Students.query.filter(Students.s_name=='小建').first()

    # 方法二:
    stu=Students.query.filter_by(s_name='老刘')
    stu=Students.query.filter_by(s_name='老刘').first()

    # 方法三:
    stus=Students.query.all()

    # 方法四:
    sql='select * from students;'
    stu=db.session.execute(sql)

    # 模糊查询
    # select * from students where s_name like '%王%'
    # select * from students where s_name like '王%'
    # select * from students where s_name like '_王%'  第二位为王
    # select * from students where s_name like '%王'
    stu=Students.query.filter(Students.s_name.contains('小'))
    stu=Students.query.filter(Students.s_name.startswith('小'))
    stu=Students.query.filter(Students.s_name.endswith('王'))

    # 查询id在某个范围之内的学生信息
    # select * from students where id in (2,3,4,5,6)
    stu=Students.query.filter(Students.id.in_([2,3,4,5,6]))

    # 运算符查询
    # 查询年龄大于19的学生信息
    stu=Students.query.filter(Students.s_age>19)
    stu=Students.query.filter(Students.s_age.__gt__(19))

    # get方法,获取主键对应的行数据
    stu=Students.query.get(2)

    # offset+limit
    stu=Students.query.limit(3)
    stu=Students.query.offset(1).limit(3)

    # 排序order_by
    stu=Students.query.order_by('-id')

    # 查询姓名中包含王的,并且年龄等于23
    stu=Students.query.filter(Students.s_name.contains('王'),
                              Students.s_age==19)
    # 查询姓名中包含王的,或年龄等于23
    # Django中:filter(Q(A)|Q(B))
    # flask中:filter(or_(A,B))
    stu=Students.query.filter(or_(Students.s_name.like('%王%'),
                              Students.s_age==19))
    # 查询姓名中不包含王的,且年龄等于23
    stu = Students.query.filter(not_(Students.s_name.like('%王%')),
                                    Students.s_age == 19)



    return render_template('select_students.html',stus=stus)


@uesrs_blue.route('/delete_stu/<int:id>')
def delete_stu(id):
    stu=Students.query.filter(Students.id==id).first()
    db.session.delete(stu)
    db.session.commit()
    return '删除成功'


@uesrs_blue.route('/update_stu/<int:id>',methods=['GET','POST'])
def update_stu(id):
    if request.method=='GET':
        return render_template('update_stu.html')
    if request.method=='POST':
        name=request.form.get('name')
        age=int(request.form.get('age'))
        stu=Students.query.filter_by(id=id).first()
        if name:
            stu.s_name=name
        if age:
            stu.s_age=age
        stu.save()
        return redirect(url_for('users.select_students'))


users->models.py

from flask_sqlalchemy import SQLAlchemy


db=SQLAlchemy()


class Students(db.Model):
    id=db.Column(db.Integer,primary_key=True,autoincrement=True)
    s_name=db.Column(db.String(10),unique=False,nullable=False)
    s_age=db.Column(db.Integer,default=19)

    __tablename__='students'


    def save(self):
        db.session.add(self)
        db.session.commit()

templates->base.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>
        {% block title %}
        {% endblock %}
    </title>

    {% block css %}
    {% endblock %}

    {% block js %}
    {% endblock %}
</head>
<body>
{% block content %}
{% endblock %}
</body>
</html>

template->base_main.html

{% extends 'base.html' %}
{% block js %}
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"type="text/javascript"></script>
{% endblock %}

template->register.html

{% extends 'base_main.html' %}
{% block title %}
    查询学生
{% endblock %}
{% block content %}
<table>
    <thead>
        <th>序号</th>
        <th>id</th>
        <th>姓名</th>
        <th>年龄</th>
        <th>操作</th>
    </thead>
    <tbody>
        {% for stu in stus %}
        <tr>
            <td>{{loop.index0}}</td>
            <td>{{stu.id}}</td>
            <td>{{stu.s_name}}</td>
            <td>{{stu.s_age}}</td>
            <td><a href="http://127.0.0.1:8080/users/update_stu/{{stu.id}}">修改</a>|<a href="http://127.0.0.1:8080/users/delete_stu/{{stu.id}}">删除</a></td>
        </tr>
        {% endfor %}
    </tbody>
</table>
{% endblock %}

template->students.html

{% extends 'base_main.html' %}
{% block title %}
    添加学生
{% endblock %}
{% block content %}
<form action="" method="post">
    姓名:<input type="text" name="name"><br>
    年龄:<input type="text" name="age"><br>
    <input type="submit" value="添加学生">
</form>
{% endblock %}


template->update_stu.html

{% extends 'base_main.html' %}
{% block title %}
    修改学生
{% endblock %}
{% block content %}
<form action="" method="post">
    姓名:<input type="text" name="name"><br>
    年龄:<input type="text" name="age"><br>
    <input type="submit" value="修改学生信息">
</form>
{% endblock %}


相关文章

  • Day18-flask3

    1. 对学生数据进行CRUD操作 语法: 获取查询集: 数据操作: 1.1 想学生表中添加数据 提交事务,使用co...

网友评论

      本文标题:Day18-flask3

      本文链接:https://www.haomeiwen.com/subject/djhmaftx.html