Python Web 框架-FLASK day05
目录
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)
- 定义模型
class MODELNAME(db.Model):
__tablename__ = 'TABLENAME'
COLUMN_NAME = db.Column(db.TYPE,OPTIONS)
...
1.FLASK-SQLALCHEMY - 查询
- 基于 db.session 进行查询
- db.session.query()
该函数会返回一个Query对象,类型为 BaseQuery,包含了指定实体类对应的表中所有的数据
该函数也可以接受多个参数,参数表示的是要查询哪个实体 - 查询执行函数
目的:在查询的基础上得到最终想要的结果
语法:db.session.query(...).查询执行函数()函数 说明 all() 以列表的方式返回查询的所有结果 first() 返回查询中的第一个结果,如果没有结果,则返回None first_or_404() 返回查询中的第一个结果,如果没有结果,则终止并返回404 count() 返回查询结果的数量 -
查询过滤器函数
作用:在查询的基础山,筛选部分列出来
语法:db.session.query(...).过滤器函数().查询执行函数()
函数 说明 filter() 指定条件进行过滤(多表,单表,定值,不定值...) filter_by() 按等值条件进行过滤 limit() 按限制行数获取 order_by() 根据指定条件进行排序 group_by 根据指定条件进行分组 详解:
-
filter()
-
查询年龄 大于30的 Users的信息
db.session.query(Users).filter(Users.age>30).all()
注意:条件必须由 模型类.属性 来组成 -
查询年龄 大于30且id大于5 的Users的信息
db.session.query(Users).filter(Users.age>30,Users.id>5).all() -
查询年龄 大于30或id大于5 的Users的信息
注意:查询 或 的操作,要借助 0r_()
db.session.query(Users).filter(or_(Users.age>30,Users.id>5)).all() -
查询id等于5的Users的信息
db.session.query(Users).filter(Users.id==5).first() -
查询email中包含‘w’ 的users的信息 - 模糊查询 like
db.session.query(Users).filter(Users.email.like('%w%')).all() -
查询id在 [1,2,3] 之间的Users 的信息
db.session.query(Users).filter(Users.id.in_([1,2,3])).all()
-
-
filter_by()
-
查询 id=5的Users的信息
db.session.query(Users).filter_by(id=5).first()
-
-
limit()
-
在整个查询结果中获取前5条记录
db.session.query(Users).limit(5).all() -
在整个查询结果中获取第2-5条结果
db.session.query(Users).limit(3).offset(1).all()
-
-
order_by()
-
对Users表中所有的数据按id倒序排列
db.session.query(Users).order_by('id desc').all()
-
-
group_by()
-
db.session.query(Users).group_by('age').all()
-
-
- db.session.query()
- 基于 Model 进行查询
Models.query.查询过滤器(条件参数).查询执行函数
2.FLASK-SQLALCHEMY - 删除 和 修改
- 删除
- 查询出要删除的实体
user = db.session.query(Users).filter_by(id=5).first() - 根据所提供的删除方法,将信息删除
db.session.delete(user)
- 查询出要删除的实体
- 修改
将id 为1 的用户的username 改为 Wang WC ,年龄改为48- 查
user = Users.query.filter_by(id=1).first() - 改
user.username = 'Wang WC'
user.age = 48 - 保存
db.session.add(user)
- 查
3.FLASK-SQLALCHEMY - 关系映射
- 一对多
语法实现
- 在‘多’实体中增加
外键列名=db.Column(db.Integer,db.ForeignKey('主表.主键')) - 在‘一’实体中增加反向引用关系
属性名=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>
上一篇: Python Web框架 Flask
下一篇: web——day02