1. 對(duì)學(xué)生數(shù)據(jù)進(jìn)行CRUD操作
語(yǔ)法:
類名.query.xxx
獲取查詢集:
all()
filter(類名.屬性名==xxx)
filter_by(屬性名=xxx)
數(shù)據(jù)操作:
在事務(wù)中處理,數(shù)據(jù)插入
db.session.add(object)
db.session.add_all(list[object])
db.session.delete(object)
db.session.commit()
修改和刪除基于查詢
1.1 想學(xué)生表中添加數(shù)據(jù)
@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 '添加成功'
提交事務(wù),使用commit提交我們的添加數(shù)據(jù)的操作
1.2 獲取所有學(xué)生信息
將學(xué)生的全部信息獲取到,并且返回給頁(yè)面,在頁(yè)面中使用for循環(huán)去解析即可
@blue.route("/getstudents/")
def get_students():
students = Student.query.all()
return render_template("StudentList.html", students=students)
1.3 獲取s_id=1的學(xué)生的信息
寫法1:
students = Student.query.filter(Student.s_id==1)
寫法2:
students = Student.query.filter_by(s_id=2)
注意:filter中可以接多個(gè)過濾條件
寫法3:
sql = 'select * from student where s_id=1'
students = db.session.execute(sql)
1.4 修改學(xué)生的信息
寫法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 刪除一個(gè)學(xué)生的信息
寫法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后的結(jié)果是一個(gè)list的結(jié)果集
重點(diǎn)注意:在增刪改中如果不commit的話,數(shù)據(jù)庫(kù)中的數(shù)據(jù)并不會(huì)更新,只會(huì)修改本地緩存中的數(shù)據(jù),所以一定需要db.session.commit()
2. 深入數(shù)據(jù)庫(kù)增刪改查
定義模型,并定義初始化的函數(shù):
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):
# 實(shí)例化Student的對(duì)象
s = Student()
# 對(duì)象的屬性賦值
s.s_name = '張三%s' % random.randrange(10000)
s.s_age = '%d' % random.randrange(100)
stus.append(s)
# 添加需要?jiǎng)?chuàng)建的數(shù)據(jù)
db.session.add_all(stus)
# 提交事務(wù)到數(shù)據(jù)庫(kù)
db.session.commit()
return '創(chuàng)建成功'
注:在創(chuàng)建單條數(shù)據(jù)的時(shí)候使用db.session.add(),在創(chuàng)建多條數(shù)據(jù)的時(shí)候使用db.session.add_all()
第二種方式:
@blue.route('/createstus/')
def create_users():
stus = []
for i in range(5):
# 使用類的初始化去創(chuàng)建Student對(duì)象
s = Student('張三%s' % random.randrange(10000),
'%d' % random.randrange(100))
stus.append(s)
db.session.add_all(stus)
db.session.commit()
return '創(chuàng)建成功'
2.2 查--使用運(yùn)算符
獲取查詢集
filter(類名.屬性名.運(yùn)算符(‘xxx’))
filter(類名.屬性 數(shù)學(xué)運(yùn)算符 值)
運(yùn)算符:
contains: 包含
startswith:以什么開始
endswith:以什么結(jié)束
in_:在范圍內(nèi)
like:模糊
__gt__: 大于
__ge__:大于等于
__lt__:小于
__le__:小于等于
邏輯運(yùn)算:
與
and_
filter(and_(條件),條件…)
或
or_
filter(or_(條件),條件…)
非
not_
filter(not_(條件),條件…)
例子1:
-
查詢學(xué)生的id為3,4,5,6,16的的學(xué)生信息,使用in_邏輯運(yùn)算
@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) -
查詢學(xué)生的年齡小于18歲的學(xué)生的信息
Student.query.filter(Student.s_age < 18) -
查詢學(xué)生的年齡小于18歲的學(xué)生的信息,lt小于
students = Student.query.filter(Student.s_age.__lt__(15)) -
查詢學(xué)生的年齡小于等于18歲的學(xué)生的信息,le小于等于
students = Student.query.filter(Student.s_age.__le__(15)) -
查詢學(xué)生的姓名以什么開始或者以什么結(jié)尾的學(xué)生的信息startswith和endswith
students = Student.query.filter(Student.s_name.startswith('張')) students = Student.query.filter(Student.s_name.endswith('2')) -
查詢id=4的學(xué)生的信息
Student.query.get(4) 獲取的結(jié)果是學(xué)生的對(duì)象 -
模糊搜索like
%:代表一個(gè)或者多個(gè) _:代表一個(gè) Student.query.filter(Student.s_name.like('%張%'))
例子:
查詢
from sqlalchemy import and_, or_, not_
查詢多個(gè)條件
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的學(xué)生
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__)
# 藍(lán)圖、設(shè)置前綴
app.register_blueprint(blueprint=uesrs_blue,url_prefix='/users')
# 設(shè)置秘鑰
app.config['SECRET_KEY']='123'
# 數(shù)據(jù)庫(kù)設(shè)置
app.config['SQLALCHEMY_DATABASE_URI']='mysql+pymysql://root:123456@127.0.0.1:3306/flask5'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS']=False
# 綁定數(shù)據(jù)庫(kù)
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():
# 用于初次創(chuàng)建模型
db.create_all()
return "創(chuàng)建成功"
@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'))
# 單個(gè)創(chuàng)建
stu=Students()
stu.s_name=name
stu.s_age=age
stu.save()
return '添加學(xué)生成功'
@uesrs_blue.route('/add_all_students/')
def add_all_students():
# 批量創(chuàng)建 add_all()
names=['小王','小圖','小坑','小進(jìn)','老金','小人','小建','小國(guó)','老劉']
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 '批量創(chuàng)建成功'
@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在某個(gè)范圍之內(nèi)的學(xué)生信息
# select * from students where id in (2,3,4,5,6)
stu=Students.query.filter(Students.id.in_([2,3,4,5,6]))
# 運(yùn)算符查詢
# 查詢年齡大于19的學(xué)生信息
stu=Students.query.filter(Students.s_age>19)
stu=Students.query.filter(Students.s_age.__gt__(19))
# get方法,獲取主鍵對(duì)應(yīng)的行數(shù)據(jù)
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 %}
查詢學(xué)生
{% endblock %}
{% block content %}
<table>
<thead>
<th>序號(hào)</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 >修改</a>|<a >刪除</a></td>
</tr>
{% endfor %}
</tbody>
</table>
{% endblock %}
template->students.html
{% extends 'base_main.html' %}
{% block title %}
添加學(xué)生
{% endblock %}
{% block content %}
<form action="" method="post">
姓名:<input type="text" name="name"><br>
年齡:<input type="text" name="age"><br>
<input type="submit" value="添加學(xué)生">
</form>
{% endblock %}
template->update_stu.html
{% extends 'base_main.html' %}
{% block title %}
修改學(xué)生
{% endblock %}
{% block content %}
<form action="" method="post">
姓名:<input type="text" name="name"><br>
年齡:<input type="text" name="age"><br>
<input type="submit" value="修改學(xué)生信息">
</form>
{% endblock %}