一、请求钩子
二、Flask上下文
三、模板过滤器和自定义过滤器
四、模板宏
-
定义宏
{% macro input() %} <input type="text" name="username" value="" size="30"/> {% endmacro %}
-
调用宏
{{ input() }}
-
定义带参数的宏
{% macro input(name,value='',type='text',size=20) %} <input type="{{ type }}" name="{{ name }}" value="{{ value }}" size="{{ size }}"/> {% endmacro %}
-
调用带参数的模板宏
{{ input(value='name',type='password',size=40)}}
-
把宏单独抽取出来,封装成html文件,其它模板中导入使用
文件名可以自定义macro.html{% macro function() %} <input type="text" name="username" placeholde="Username"> <input type="password" name="password" placeholde="Password"> <input type="submit"> {% endmacro %}
-
在其它模板文件中先导入,再调用
{% import 'macro.html' as func %} {% func.function() %}
五、模板的闪现
六、使用SQLAlchemy的配置
-
安装SQLAlchemy
1.安装SQLAlchemy pip3 install sqlalchemy 2.Flask中需要使用flask-sqlalchemy支持包 pip3 install flask-sqlalchemy
-
app.config[‘SQLALCHEMY_DATABASE_URI’]=“mysql://用户名:密码@数据库服务器地址:端口号/数据库名称”
app.config['SQLALCHEMY_DATABASE_URI']='mysql://root:123456@127.0.0.1:3306/flaskDB'
-
设置SQLAlchemy自动跟踪数据库
看需求设置True和False app.config['SQLALCHEMY_TRACE_MODIFICATIONS'] = False
七、创建模型类
-
语法
class MODELNAME(DB.Model): __tablename__ = "TABLENAME" COLUMN_NAME = db.Column(db.TYPE,OPTIONS)
-
db.type类型
-
db.TYPE 列类型:
类型名 数据库 python 说明 Integer int int Float float float Numeric numeric Decimal 定点数 String varchar str Text text str Boolean tinyint bool Date date datetime.date DateTime datetime datetime.datetime` OPTIOINS 列选项 选项名 说明 autoincrement 如果取值为true,则自动增长 注意: 如果列类型为整数,并且是主键的话,默认就是自增长的 primary_key 如果取值为true表示该列为主键 unique 如果取值为true表示该列唯一 index 如果取值为true表示该列加索引 nullable 如果取值为true表示该列可为空 default 指定该列默认值
-
数据迁移
1.什么是数据库迁移? 将实体类的改动在映射回数据库。 2.依赖于第三方库。 1.flask-script 安装:pip3 install flask-script 包:flask_script 类:Manager 作用,对项目进行管理。 启动项目,为项目增加管理指令。 2.flask-migrate 安装:pip3 install flask-migrate 包:flask_migrate 类: 1.Migrate 作用:协调app和db 之间的关系 2.MigrateCommand 作用:在终端中提供实体类迁移的指令 3.python3 flaskDB.py db 1.init 作用:执行项目和数据库的初始化操作 特点:一个项目中只执行一次即可 2.migrate 作用:将编辑好的实体类生成一个中间文件并保存 特点:只要检测到实体类有更改,就会生成中间文件。 3.upgrade 作用:将中间文件映射会数据库
-
数据库的CRUD
- 增加
-
创建实体类对象,并为对象的属性赋值
user = Users() user.username = "xxxx" user.age = 30 user.isActive = True user.birthday = "1980-10-12"
-
将实体对象保存回数据库
db.session.add(user) #增加数据 db.session.commit() #提交事务
-
- 查询
- 增加
1.基于 db.session 进行查询
1.db.session.query()
参数:
要查询的列,如果查询多个列的话使用,隔开,如果要查询所有列,参数为实体类名
示例:
1.查询User实体类中的id,username
db.session.query(Users.id,Users.username)
2.查询Users实体类中所有的类
db.session.query(Users)
3.查询Users以及Wife实体类所有的列
db.session.query(Users,Wife)
返回值:
返回一个Query对象,类型为BaseQuery
2.查询执行函数
作用:在query的基础上得到最终的查询结果
语法:db.session.query(XXX).查询执行函数()
1.all()
以列表的方式返回所有数据
2.first()
以实体对象的方式返回第一条数据
没有查询到数据返回None
3.first_or_404()
效果同上
没有查询到结果则相应404
4.count()
返回查询结果的数量
3.查询过滤器函数
作用:在db.session.query()追加条件
语法:db.session.query(XX).过滤器函数().执行函数()
1.filter()
各种查询条件均可实现 where
2.filter_by()
只做等值条件判断
语法:db.session.query(xxx).filter_by(属性=值).all()
示例:
查询Users中id=2的用户信息
db.session.query(Users).filter_by(id=2).all()
3.limit()
获取限定函数
示例:获取Users中前两条数据
db.session.query(Users).limit(2).all()
4.offset()
指定结果的偏移量
示例:获取Users中跳过前两条数据的剩余数量
db.session.query(Users).offset(2)
查询过滤器
1.查询过滤器方法
1.filter()
1. filter(实体类.属性 == 值)
2. filter(实体类.属性 > 值)
3. filter(条件1,条件2)
filter(条件1).filter(条件2)
4. filter(or_(条件1,条件2))
5. filter(实体类.属性.like('%xx%'))
6. filter(实体类.属性.in_([值1,值2]))
7. filter(实体类.属性.between(数值1,数值2))
2.filter_by(属性=值)
3.limit(n) & offset(n)
order_by()
作用:排序
语法:db.session.query(XXX).order_by("排序规则")
示例:
1.Users实体中所有的数据按年龄降序排序
select * from users order by age desc
db.session.query(Users).order_by("age desc")
2.Users实体中所有的数据先按年龄降序排序,再按id升序排序
select * from users order by age desc,id asc
db.session.query(Users).order_by("age desc,id")
3.Users实体中查询出年龄大于18的按age倒序排
db.session.query(Users)
.filter(Users.age>18)
.order_by("age desc")
.all()
聚合查询
1.基本的聚合查询
1.聚合函数
from sqlalchemy import func
#func中提供了所有的聚合函数
聚合函数:
sum() : func.sum()
count() :
max() :
min() :
avg() :
2.语法
db.session
.query(
func.聚合函数(实体类.属性),
func.聚合函数(实体类.属性)
).all()
2.分组聚合查询
db.session.query(查询列,聚合列)
.filter(条件) #分组前数据筛选 - where
.group_by('分组列名') #分组 - group by
.having(条件) #分组后筛选 - having
示例:
查询users表中年龄大于18岁的,按照isActive分组,组内人数大于2人的组名和人数查询出来
db.session.query(
Users.isActive,
func.count(Users.id)
).filter(Users.age > 18)
.group_by('isActive')
.having(
func.count(Users.id) >= 2
)
-
修改
1.查 查询出要修改的实体对象 2.改 通过 对象.属性=值 修改数据 3.保存 db.session.add(对象)
-
删除
1.查 查询出要修改的实体对象 2.删 db.session.delete(对象)
-
基于实体类的查询
语法:
实体类.query.查询过滤器函数().查询执行函数()
示例:
1.查询Users实体中所有的数据
Users.query.all()
2.查询Users实体中isActive为True的数据
Users.query.filter_by(isActive=True).all()
Users.query.filter(Users.isActive==True).all()