数据模型续
# 数据模型 ### 模型关系 - 一对多(使用最多) - 一:学生(Student) - 添加反向引用 - 多:文章(Article) - 添加外键关联 - 一对一 - 一:学生(Student) - 添加反向引用(在一对多的基础上多添加属性:`uselist=False`) - 一:详情(Profile) - 添加外键关联 - 多对多 - 多:学生(Student) - 需要添加反向引用 - 需要使用`secondary`指定中间关联表 - 设置反向查询数据的加载时机,需要使用:`db.backref` - 多:课程(Course) - 中间关联表:此表不需要用户维护 - 表名 - 关联外键 ### 模型总结 - 等价查询 ```python @app.route('/query/') def query(): # students = Student.query.all() # 与上面的方式等价 students = db.session.query(Student).all() return ','.join(s.name for s in students) ``` - group_by:分组查询 ```python @app.route('/group/') def group(): from sqlalchemy import func ret = db.session.query(Student.id, func.count(Student.id)).group_by(Student.id).all() print(ret) return '分组查询' ``` > 分组查询并统计。 - 指定字段查询 ```python @app.route('/select/') def select(): # ret = db.session.query(Student.id, Student.name).all() ret = Student.query.with_entities(Student.name).all() print(ret) return '指定字段查询' ``` - 分页查询:paginate,项目中讲解。 - SQL日志:就是查看执行过的SQL语句 ```python from flask_sqlalchemy import get_debug_queries # 记录SQL日志,以下3个配置必须满足一个 # 调试模式 # app.config['DEBUG'] = True # 测试模式 # app.config['TESTING'] = True # 保存记录 app.config['SQLALCHEMY_RECORD_QUERIES'] = True queries = get_debug_queries() for q in queries: print(q) ``` ### 数据缓存 - 说明: 因为数据库的速度是一个web应用性能的瓶颈,因此,为了提高访问效率,尽可能的减少数据库的操作。可以将经常访问的数据缓存起来,再次使用时直接从缓存中获取,而不是每次都操作数据库。 - flask-cache:专门负责数据缓存的扩展。 - 安装:`pip install flask-cache` - 使用: ```python from flask_cache import Cache # 配置 # 缓存类型 app.config['CACHE_TYPE'] = 'redis' # redis主机 app.config['CACHE_REDIS_HOST'] = '127.0.0.1' # redis端口 app.config['CACHE_REDIS_PORT'] = 6379 # redis数据库 app.config['CACHE_REDIS_DB'] = 1 # 创建对象 cache = Cache(app, with_jinja2_ext=False) ``` - 缓存视图函数 ```python # timeout:有效期,默认为300s # key_prefix:键前缀 @cache.cached(timeout=100, key_prefix='index') def index(): print('查询数据库') return '数据缓存' ``` - 清除缓存 ```python @app.route('/delete/') def delete(): # 指定删除 # cache.delete('index') # 清空全部 cache.clear() return '缓存已删除' ``` - 缓存普通函数 ```python # 缓存普通函数时最好指定key_prefix参数 # 因为不指定时,缓存的键前缀默认是调用的视图函数所在路由 @cache.cached(timeout=10, key_prefix='aaa') def aaa(): print('查询数据库') return 'hello world' # 缓存普通函数 @app.route('/common/') def common(): return aaa() ``` - 自定义缓存 ```python @app.route('/test/') def test(): # 先从缓存中获取数据 data = cache.get('test_data') if data: # 有缓存,直接返回 return data # 没有缓存 print('读取数据库') data = '123456' # 将数据缓存起来 cache.set('test_data', data, timeout=20) return data ```