flask框架4
文章目录
一. 图书案例 (重点)
1. 定义模型&添加测试数据
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
# 设置数据库的连接地址
app.config["SQLALCHEMY_DATABASE_URI"] = "mysql://root:mysql@127.0.0.1:3306/book20"
# 是否监听数据库变化 一般不打开, 比较消耗性能
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
# 创建数据库操作对象(建立了数据库连接)
db = SQLAlchemy(app)
# 作者表 一
class Author(db.Model):
__tablename__ = "authors"
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(48), unique=True)
books = db.relationship("Book", backref="author") # 关系属性
# 书籍表 多
class Book(db.Model):
__tablename__ = "books"
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(48), unique=True)
author_id = db.Column(db.Integer, db.ForeignKey("authors.id")) # 设置外键
@app.route('/')
def index():
return "index"
if __name__ == '__main__':
# 会删除所有继承db.Model的表
db.drop_all()
# 会创建所有继承自db.Model的表
db.create_all()
# 生成数据
au1 = Author(name='老王')
au2 = Author(name='老尹')
au3 = Author(name='老刘')
# 把数据提交给用户会话
db.session.add_all([au1, au2, au3])
# 提交会话
db.session.commit()
bk1 = Book(name='老王回忆录', author_id=au1.id)
bk2 = Book(name='我读书少,你别骗我', author_id=au1.id)
bk3 = Book(name='如何才能让自己更骚', author_id=au2.id)
bk4 = Book(name='怎样征服美丽少女', author_id=au3.id)
bk5 = Book(name='如何征服英俊少男', author_id=au3.id)
# 把数据提交给用户会话
db.session.add_all([bk1, bk2, bk3, bk4, bk5])
# 提交会话
db.session.commit()
app.run(debug=True)
2. 显示界面
3. 增加数据
数据库操作
必须进行异常捕获
- 数据库
增删改
操作失败, 需要回滚
4. 删除数据
- 删除书籍
- 使用动态URL来传递书籍信息
- 查询书籍模型, 从数据库中删除数据
- 删除作者
- 使用查询字符串来传递作者信息
- 删除作者和书籍
删除一对多关系数据时, 先删除多的一方
二. 多对多关系
- 实现
多对多
关系, 必须定义一张关系表
来记录外键, 来实现两张表的关联
三. 数据迁移
-
作用: 在
保留原数据
的前提下,更新表结构
-
需要安装flask组件
flask-migrate
-
数据迁移需要依赖
脚本启动
组件flask-script
(需要利用脚本启动组件生成迁移命令) -
迁移命令
- 初始化迁移文件夹
python hm_03_数据迁移.py mc init
- 生成版本(会
自动
根据现有代码的数据库结构, 生成升级代码)python hm_03_数据迁移.py mc migrate -m "构建表结构"
- 升级版本
python hm_03_数据迁移.py mc upgrade
- 初始化迁移文件夹
- 当前当前版本
python hm_03_数据迁移.py mc current
- 查看历史版本
python hm_03_数据迁移.py mc history
- 切换到指定的版本(版本号前6位)
python hm_03_数据迁移.py mc upgrade 956979
四. 蓝图
1. 蓝图的基本使用 (重点)
- 作用: 让flask项目实现
模块化
- 想要在其他文件中注册路由, 不能使用app, 必须使用蓝图
五. Redis
1. NOSQL 和 Redis介绍 (了解)
-
nosql: 非关系型数据库
-
数据以
键值
方式存取, 不能像关系型数据库一样使用外键建立表之间的关系, 不适合用于关系特别复杂的数据查询场景
-
数据库存放形式很多, 每种非关系型数据库又有自己的使用场景
-
Redis优势
- 性能极高 – 内存型数据库,读写速度极快
- 丰富的数据类型 – 支持存储 Strings, Lists, Hashes, Sets 及 Ordered Sets 等多种数据类型。
- 数据持久化 – 可以将内存数据保存到磁盘中, 并提供多种存储机制。
- 数据备份 – 支持主从模式 (master - slave) 的数据备份。
- 集群 – 支持集群, 并实现了哨兵机制。
- 丰富的特性 – 设置过期时间, 发布/订阅, 通知等机制。
-
Redis应用场景
- session存储 (性能更好, 方便设置过期时间)
- 网页缓存 (将 请求的url/返回的网页内容 作为redis的key/value进行缓存)
2. 配置
- 配置文件
/etc/redis/redis.conf
3. 客户端&服务端 命令
- 启动redis数据库
sudo redis-server /etc/redis/redis.conf
- 终端访问redis数据库
sudo redis-cli -h 127.0.0.1 -p 6379
4. String (重点)
- 5个命令:
- set 添加/修改数据
- get 获取数据
- mset 添加多个数据
- mget 获取多个数据
- append 拼接数据
5. 键命令 (重点)
- 6个命令:
- del 删除数据
- type 获取数据类型
- exists 判断数据是否存在
- expire 设置数据的过期时间
- ttl 查看数据剩余过期时间
- keys * 根据条件查询匹配的键
6. hash
- 类似
字典
格式 - 7个命令
- hset 设置数据的某个字段
- hget 获取数据的某个字段
- hmset 设置数据多个字段
- hmget 获取数据的多个字段
- hdel 删除数据的字段
- hkeys 获取数据的所有字段名
- hvals 获取数据的所有字段数据
7. list
栈结构, 先进后出
- 5个命令
- lpush 添加数据
- lrange 获取数据
- linsert 插入数据
- lset 修改数据
- lrem 删除数据
8. zset 和 set
-
zset 有序集合 按照
权重
进行排序 -
6个命令:
- zadd 添加数据
- zrange 获取数据
- zscore 获取数据的权重
- zrem 删除数据
- zrangebyscore 获取指定范围的数据
- zremrangebyscore 删除指定范围的数据
-
set 无序集合
无序且去重
-
3个命令
- sadd 添加数据
- smembers 获取数据
- srem 删除数据
9. python操作redis (重点)
安装第三方包 pip install redis
from redis import StrictRedis
# 创建redis的操作对象(建立连接) decode_responses=True自动解码
sr = StrictRedis(host="127.0.0.1", port=6379, db=0, decode_responses=True)
# 操作redis
# 添加数据
sr.set("name", "zs", ex=10)
# 获取数据
print(sr.get("name"))
# 关闭数据库 只要设置了自动持久化策略, 都会将数据先保存到硬盘中, 再关闭
sr.shutdown()