石家庄市工程建设造价管理站网站伪造wordpress浏览量
1_ORM概述[理解]
- 解释: 对象关系映射模型
 - 特点: 
- 1.将类名,属性, 映射成数据库的表名和字段
 - 2.类的对象,会映射成为数据库表中的一行一行的数据
 
 - 优缺点: 
- 优点: 
- 1.不再需要编写sql语句
 - 2.不再关心使用的是什么数据库了
 
 - 缺点: 
- 1.由于不是直接通过sql操作数据库,所以有性能损失
 
 
 - 优点: 
 
2_ORM操作流程[掌握]
- 操作流程: 
- 1.安装扩展 
- pip install flask_sqlalchemy
 - pip install flask_mysqldb / pymysql
 
 - 2.设置数据库的配置信息
 - 3.创建sqlalchemy对象db,关联app
 - 4.编写模型类,继承自db.Model,编写字段
 - 5.操作数据库 
- 增删改
 - 查询
 
 
 - 1.安装扩展 
 
3_ORM操作注意[理解]
-  
注意点:
-  
1.因为SQLALChemy去app身上读取了配置信息,所以需要设置到app.config身上
 -  
2.数据库的链接信息
- 如果安装的是flask_mysqldb, 那么链接信息: mysql://<用户名>:<密码>@<ip地址>:<端口号>/<数据库名字>
 - 如果安装的是pymysql, 那么链接信息: mysql+pymysql://<用户名>:<密码>@<ip地址>:<端口号>/<数据库名字>
 
 -  
3.编写的模型类必须继承自db.Model才能被映射
 -  
4.如果不指定表名称,默认生成的就是模型类的小写,如果需要自己指定表名使用_tablename_=‘表名’
 -  
5.ORM在进行映射的时候不能生成数据库的
 
 -  
 
4_数据库增删改[掌握]
- 增删改 
- 全部都是使用db.session操作
 - 常见方法: 
- db.session.add(obj) 添加单个对象
 - db.session.add_all([obj1,obj2]) 添加多个对象
 - db.session.delete(obj) 删除单个对象
 - db.session.commit() 提交会话
 - db.drop_all() 删除继承自db.Model所有表
 - db.create_all() :创建继承自db.Model的所有表
 - 其他: 
- db.session.rollback() 回滚
 - db.session.remove() 移除会话
 
 - 案例: 编写两个模型类, 一个角色模型类, 还有一个用户模型类 
- 关系: 一对多
 
 - 注意点: 
- 如果想要打印一个对象的时候看到指定的信息, 那么重写__repr__方法
 
 
 
 
5_数据库基本查询[掌握]
- 全部都是通过, 模型类.query来进行的 
- 使用常见的12条语句
 
 
6_数据库关系查询relationship[掌握]
-  
解释: 为了方便数据库的关联查询
 -  
特点:
- 1.不会在数据库产生实体字段
 - 2.关系属性,需要在一方添加
 - 3.外键是添加在一方的, 并且关系属性的使用,需要依赖于外键
 
 -  
需求:
-  
1.如果知道了角色的情况下,能否快速查询出,哪些用户扮演了该角色
- 原始查询方法: 
- role = Role.query.get(1)
 - users = User.query.filter(User.role_id == role.id).all()
 
 - 快速查询: 
- 使用relationship添加关系属性,就可以快速查询了.
 - 格式: 
- users = db.relationship(“多方的模型类”)
 
 - 使用格式: 
- role = Role.query.get(1)
 - users = role.users
 
 
 
 - 原始查询方法: 
 
 -  
 
7_数据库反向查询backref[掌握]
- 解释:如果知道了用户的情况下,能否快速查询出,哪些该用户扮演了哪个角色
 
- 原始查询方法: 
- user = User.query.get(1)
 - role = Role.querye.filter(Role.id == user.role_id).first()
 
 - 快速查询: 
- 使用backref添加反向属性,就可以快速查询了
 - 格式: 
- users = db.relationship(“多方的模型类”,backref=“role”)
 
 - 快速查询: 
- user = User.query.get(1)
 - role = user.role
 
 
 
8_数据库懒查询lazy[了解]
- 解释: 一旦使用了relationship,backref,那么系统会自动做子查询 
- 子查询(subquery): 查询出了一方, 就会自动的讲关联的一方查询出来
 - 动态查询(dynamic): 只有用到了才去查询
 
 - lazy使用 
- db.relationship(“多方的模型类”,backref=“role”,lazy=“dynamic”)
 
 
9_图书馆数据库搭建[掌握]
- 分析图书馆案例 
- 1.数据库配置 
- 作者模型(一方)
 - 书籍模型(多方)
 
 - 2.添加测试数据
 - 3.添加作者,书籍
 - 4.删除作者,删除书籍
 
 - 1.数据库配置 
 
10_图书馆测试数据添加[掌握]
- 提示: 测试数据,见讲义文档
 
11_图书馆测试数据显示[掌握]
- 步骤 
- 1.查询所有作者信息
 - 2.携带作者信息,渲染页面
 
 
12_图书馆添加数据[掌握]
- 添加的逻辑分析: 
- 1.如果作者存在,书籍存在, 不能添加
 - 2.如果作者存在,书籍不存在,可以添加
 - 3.如果作者不存在,可以添加
 
 
13_图书馆删除书籍[掌握]
- 步骤 
- 1.根据书籍编号获取书籍对象
 - 2.删除书籍对象
 - 3.重定向到页面展示
 
 
14_图书馆删除作者[掌握]
- 步骤 
- 1.根据作者编号获取作者对象
 - 2.遍历删除,作者书籍对象
 - 3.删除作者,提交数据库
 - 4.重定向到页面展示
 
 
15_图书馆CSRFProtect应用[掌握]
- 作用: 防止csrf攻击的[项目倒数第二天看源代码校验过程]
 - 使用步骤: 
- 1.导入类CSRFProtect
 - 2.使用CSRFProtect保护app 
- 一旦使用POST,PUT,DELTE,PATCH方式提交的时候就需要校验csrf_token
 
 - 3.需要设置SECRET_KEY,用来加密csrf_token
 - 4.设置csrf_token到表单中
 
 
16_表结构多对多分析[掌握]
- 解释: 多对多的关系,一般会被拆分成两张一对多的表
 
17_表结构多对多代码演练[掌握]
-  
中间表:
tb_student_course = db.Table("tb_student_course",db.Column("student_id",db.Integer,db.Foreign("students.id"))db.Column("courses_id",db.Integer,db.Foreign("courses.id")) ) 
18_表结构模板代码分析[了解]
- 提示: 见keynote, PDF文档
 
19_数据库迁移[掌握]
- 目的: 当数据库的表结构发生变化之后,如果直接删除原有的数据,再添加新的数据,有可能导致数据丢失
 - 注意点: 
- 1.是为了备份表结构,而不是数据
 - 2.如果想要备份数据,需要使用工具,navicat,mysqlworkbench,等等
 - 3.更新的过程数据一般不会丢失,做降级的时候需要谨慎操作
 
 - 操作流程: 
- 1.安装扩展 
- pip install flask_script
 - pip install flask_migrate
 
 - 2.导入三个类 
- from flask_script import Manager
 - from flask_migrate import Migrate, MigrateCommand
 
 - 3.通过Manager类创建对象manager,管理app 
- manager = Manager(app)
 
 - 4.使用Migrate,关联db,app 
- Migrate(app,db)
 
 - 5.给manager添加一条操作命令 
- manager.add_command(“db”,MigrateCommand)
 
 - 相关迁移命令: 
- 生成迁移文件夹[一次就好] 
- python xxx.py db init
 
 - 将模型类生成迁移脚本[重复执行] 
- python xxx.py db migrate -m ‘注释’
 
 - 将迁移脚本更新到数据库中[重复执行] 
- python xxx.py db upgrade/downgrade [version]
 
 - 其他命令 
- 查看最新版本的命令 
- python xxx.py db show
 
 - 查看当前版本 
- python xxx.py db current
 
 - 查看所有的历史版本 
- python xxx.py db history
 
 
 - 查看最新版本的命令 
 
 - 生成迁移文件夹[一次就好] 
 
 - 1.安装扩展 
 
