Flaks-SQLALchemy扩展
- 在Flask中使用数据库要用到Flask-SQLALchemy扩展,Flask-SQLALchemy应用了SQLALchemy框架
- SQLAlchemy是一个关系型数据库框架,它提供了高层的ORM和底层的原生数据库的操作。
- SQLALchemy 实际上是对数据库的抽象,让开发者不用直接和 SQL 语句打交道,而是通过 Python 对象来操作数据库,在舍弃一些性能开销的同时,换来的是开发效率的较大提升
Django与Flask操作数据库的对比
使用SQLAlchemy操作数据库
- 安装flask-sqlalchemy扩展
- pip install flask-sqlalchemy 安装sqlalchemy数据库拓展
- 配置SQLALchemy
- 导入SQLAlchemy
- from flask import flask
- from flask_sqlalchemy import SQLAlchemy
- 配置数据库连接的URI并初始化SQLAlchemy
- 配置数据库的连接方式
- app = Flask(__name__)
- app.config["SQLALCHEMY_DATABASE_URI"] ="mysql://root:mysql@127.0.0.1:3306/py3"
- 配置是否追踪数据库的修改操作,即数据库有修改就会提示
- app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
- 初始化SQLAlchemy
- db = SQLAlchemy(app)
- SQLAlchemy其他的配置
- 创建模型类(对应数据库的表)
- 创建模型类应用到的方法和参数
- 一对多模型
- __tablename__: 创建表的表名(不写默认为类型小写)
- db.Column: 代表创建表的字段
- 第一个参数为数据类型,其他的为该字段的约束条件
- db.ForeignKey() 代表设置外键字段
- db.relationship (前提是设置了外键)设置表的关系属性,在一对多关系中常设置在一的一端,可以通过一端查询多端数据
- backref: 反向引用,可以通过关联表的另一端的实例,查询到该表的数据
- lazy: 默认为subquery
- 设置为subquery,则会在设置关系字段的一端加载完对象后,就立即加载与其关联的对象,这样会让总查询数量减少,但如果返回的条目数量很多,就会比较慢
- 设置为 subquery 的话,author.books 返回所有数据列表
- 设置为动态方式dynamic,这样关联对象会在被使用的时候再进行加载,并且在返回前进行过滤,如果返回的对象数很多,或者未来会变得很多,那最好采用这种方式
- 设置为 dynamic 的话,role.users 返回模型实例对象
- __repr__方法: 代表打印实例的时候,显示的内容
- 代码示例:
- 多对多模型
- 代码示例
- 常用的SQLALchemy字段类型
- 常用的SQLALchemy列选项
- 常用的SQLALchemy关系选项
- 数据库表的操作
- 在数据库中创建对应模型类的表
- db.creat_all()
- 清空数据库中的所有表
- db.drop_all()
- 数据库增、删、改、查操作
- 数据库操作原理
- 在Flask-SQLAlchemy中,插入、修改、删除操作,均由数据库会话管理。
- 会话用db.session表示。在准备把数据写入数据库前,要先将数据添加到会话中然后调用 commit() 方法提交会话。
- 在Flask-SQLAlchemy中,查询操作是通过query对象操作数据。
- 最基本的查询是返回表中所有数据,可以通过过滤器进行更精确的数据库查询。
- 数据库会话操作
- 对操作进行提交,默认是不会进行提交的
- db.session.commit()
- 对数据库操作进行回滚操作
- db.session.rollback()
- 对数据进行删除
- db.session.delete()
- 取消和数据库的连接
- db.session.remove()
- 数据库的增删改查
- 添加数据(创建数据实例,向表中添加)
- 单条添加
- rol = Role(name='admin')
- db.session.add(ro1)
- db.session.commit()
- 批量添加数据
- rol = Role(name='admin')
- rol = Role(name='admin')
- db.session.add_all([ rol1, rol2 ])
- db.session.commit()
- 删除数据(获取到数据实例,再进行删除)
- db.session.delete(rol1)
- 修改数据(获取到数据实例,在进行修改)
- rol.name = '改变后的值'
- 查询数据
- 查询所用方法
- limit()返回范围内的查询结果
- 查询所用过滤器
- filter_by精确查询
- User.query.filter_by(id=4).first()
- filter模糊查询
- User.query.filter(User.name.endswith('g').all()
- User.query.filter(User.name.startswith('a')).all()
- filter条件查询
- 等查询
- User.query.filter(User.id==4).first()
- 非查询
- from sqlalchemy import not_
- User.query.filter(not_(User.name=='wang')).all()
- 与查询
- from sqlanchemy import and_
- User.query.filter(and_(User.name.startswith('li'), User.email.startswith('li'))).all()
- 可以直接不使用and_进行与查询,默认写多个条件就是与的关系
- 或查询
- from sqlanchemy import or_
- User.query.filter(or_(User.password=='123', User.email.endswith('li'))).all()
- 范围查询
- User.query.filter(User.id.in_([1, 2, 3, 4])).all()
- 排序查询
- User.query.order_by(User.email.desc()).all()
- 分页查询
- paginate = User.query.paginate(2, 3, False)
- 参数分别:查询第几页,每页几条数据,是否有错误输出
- paginate.page 当前页
- paginate.pages 所有页数
- paginate.items 当前分页当中过得所有模型对象
- 关联查询
- 在一端查询多段数据
- rol1. users.all()
- users为在模型类中设置的关系字段
- 通过一端的记录对象来查询多端的所用关联对象(前提是设置了关系字段)
- 在多端查询一端的数据
- user.role.first()
- role为关系字段的backref属性的内容