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:
-
查询学生的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)
-
查询学生的年龄小于18岁的学生的信息
Student.query.filter(Student.s_age < 18)
-
查询学生的年龄小于18岁的学生的信息,lt小于
students = Student.query.filter(Student.s_age.__lt__(15))
-
查询学生的年龄小于等于18岁的学生的信息,le小于等于
students = Student.query.filter(Student.s_age.__le__(15))
-
查询学生的姓名以什么开始或者以什么结尾的学生的信息startswith和endswith
students = Student.query.filter(Student.s_name.startswith('张')) students = Student.query.filter(Student.s_name.endswith('2'))
-
查询id=4的学生的信息
Student.query.get(4) 获取的结果是学生的对象
-
模糊搜索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 %}