Day18-flask3

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 %}


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,324评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,356评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,328评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,147评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,160评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,115评论 1 296
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,025评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,867评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,307评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,528评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,688评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,409评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,001评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,657评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,811评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,685评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,573评论 2 353

推荐阅读更多精彩内容

  • 用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你...
    hw1212阅读 12,712评论 2 59
  • 担当,当事情来临时挺起胸膛来拥抱事情,这样才会具有主动权。倾财足以聚人,量宽足以得人,律己足以服人,身先足以率人。...
    若水向善阅读 446评论 0 0
  • 感觉更新很累,但是又要坚持。 昨天到然乌,经历大半天的雨骑,而且然乌这个地方怎么说呢?虽然有个然乌湖旅游景区,但是...
    低调zb阅读 562评论 0 2
  • 如果不熟悉 Tabs,也可以去ionicframework官网了解一下。 一、底部tab切换,默认选中第二个 ht...
    猿奇阅读 2,092评论 1 1
  • 从小到大,我就没有被女孩欣赏过。虽然我知道我长得帅、有才华、有气质,但是好像别人认为的都跟我认为的不一样。从小到大...
    连接一切阅读 291评论 0 0