Flask model、查询、缓存
1、新建flask项目流程梳理
1.1、新建项目
1.2、改成我们想要的样子
①修改管理文件名
②安装插件
安装flask_script:pip install flask_script
③修改管理文件
④新建python文件夹App,并写入如下内容
⑤修改创建方式,并添加环境变量
⑥初始化整个项目的配置
初始化配置前先安装pymysql:pip install pymysql
新建一个App/settings.py,内容如下
import os
# os.path.abspath(__file__)获取当前文件的绝对路径
# os.path.dirname()获取当前路径的上一级路径
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# 获取数据库地址
def get_db_url(dbinfo):
engine = dbinfo.get("ENGINE") or "sqlite"
driver = dbinfo.get("DRIVER") or "sqlite"
user = dbinfo.get("USER") or ""
password = dbinfo.get("PASSWORD") or ""
host = dbinfo.get("HOST") or ""
port = dbinfo.get("PORT") or ""
name = dbinfo.get("NAME") or ""
return "{}+{}://{}:{}@{}:{}/{}".format(engine, driver, user, password, host, port, name)
class Config:
# 开发环境
DEBUG = False
# 测试环境
TESTING = False
# 数据库
SQLALCHEMY_TRACK_MODIFICATIONS = False
SECTET_KEY = "123456789"
SESSION_TYPE = "redis"
# 开发环境
class DevelopConfig(Config):
DEBUG = True
dbinfo = {
"ENGINE": "mysql",
"DRIVER": "pymysql",
"USER": "root",
"PASSWORD": "root",
"NAME": "Flask2",
"HOST": "localhost",
"PORT": "3306",
}
SQLALCHEMY_DATABASE_URI = get_db_url(dbinfo)
# 测试环境
class TestConfig(Config):
TESTING = True
dbinfo = {
# 什么数据库
"ENGINE": "mysql",
# 驱动名
"DRIVER": "pymysql",
# 数据库用户名
"USER": "root",
# 密码
"PASSWORD": "root",
# 创建的库名
"NAME": "Flask2",
"HOST": "localhost",
"PORT": "3306",
}
SQLALCHEMY_DATABASE_URI = get_db_url(dbinfo)
# 演示环境
class StagingConfig(Config):
dbinfo = {
# 什么数据库
"ENGINE": "mysql",
# 驱动名
"DRIVER": "pymysql",
# 数据库用户名
"USER": "root",
# 密码
"PASSWORD": "root",
# 创建的库名
"NAME": "Flask2",
"HOST": "localhost",
"PORT": "3306",
}
SQLALCHEMY_DATABASE_URI = get_db_url(dbinfo)
# 生产环境
class ProductConfig(Config):
DEBUG = True
dbinfo = {
# 什么数据库
"ENGINE": "mysql",
# 驱动名
"DRIVER": "pymysql",
# 数据库用户名
"USER": "root",
# 密码
"PASSWORD": "root",
# 创建的库名
"NAME": "Flask2",
"HOST": "localhost",
"PORT": "3306",
}
SQLALCHEMY_DATABASE_URI = get_db_url(dbinfo)
envs = {
"develop": DevelopConfig,
"testing": TestConfig,
"staging": StagingConfig,
"product": ProductConfig,
"default": DevelopConfig
}
在App/init.py里面配置
⑦初始化整个项目的插件、扩展库
安装sqlachemy:pip install flask-sqlalchemy
安装migrate:pip install flask-migrate
新建一个App/ext.py,内容如下
在App/init.py里面配置
⑧新建视图App/views.py,内容如下
在App/init.py里面配置
1.3、创建数据库
登录mysql:mysql -uroot -proot;
建库:create database Flask2 charset=utf8;
在manage.py注册db
迁移
python manage.py db init
打开mysql图形化界面
1.4、运行
python manage.py runserver -r -d
2、model
2.1、模型里面的字段类型
2.2、新建一个模型
新建App/models.py
在视图里面声明一下(flask里面视图和路由都写在views里面,所有有时views也叫它路由)
迁移
python manage.py db migrate
python manage.py db upgrade
数据库里生成了对应的表
新建一个添加student的路由试试
@blue.route('/add/')
def add():
student = Student()
student.name = "小明%d号" % random.randrange(10000)
db.session.add(student)
db.session.commit()
return '添加成功'
运行并访问
2.3、常用数据操作
同时添加几条数据实例
查询实例
删除实例
更新实例
2.4、约束
2.5、模型继承
迁移后
我们发现新增表只有animal,其他的都在animal里面
我们给cat和dog添加数据试试
重启服务器并访问
查看数据库,我们发现表里的数据是错乱的
解决这个问题:在父类添加–abstract–=true
python manage.py db downgrade降级后删掉最后生成animal表的迁移文件
然后重新生成迁移,执行迁移
查看数据库
重启服务器并访问后,数据正确添加进来了
2.6、条件查询
在数据库里插入一些数据
2.6.1、获取id大于2的,实例
.all( )返回的是一个list类型
实例
也可以直接用运算符
2.6.2、获取id小于5的,实例
实例
2.6.3、获取包含“猫”的,实例
2.6.4、筛选,实例
偏移、限制的实例
排序实例:排序最先执行,排序不能放在offset、limit后面
2.6.5、自己写分页查询,实例
先往数据库里插入一些数据
访问执行后,查看数据库
写分页视图
html
运行并访问
2.6.6、paginate()分页查询,实例
显示页码实例:
html
视图
运行并访问
2.6.7、filter_by,实例
2.7、级联查询
2.7.1、手动实现 级联查询,实例
models.py
迁移
视图(路由):级联
运行后访问:
添加顾客
添加地址
查看数据库
视图:获取某个顾客信息
获取地址
html
访问
2.7.2、db.relationship() 级联查询,实例
模型:添加relationship()后,视图里面就直接可以调用这个级联,添加这句话不用重新迁移,因为它不入库
视图
运行后访问
2.8、逻辑运算
例
3、项目中数据库的优化
连接池:优化连接的通道(和数据库对接的通道),让多余的线程等待
mysql,默认两个小时回收没有用的连接
4、flask-caching
先安装:pip install flask-caching
写入插件ext.py:
在视图里面加入缓存:缓存函数,存入的是return结果
也可以使用redis
启动redis
运行并访问
falsk-caching具体用法参考
https://www.cnblogs.com/cwp-bg/p/9687005.html