Flask-SQLAlchemy数据库交互

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属性的内容

刘小恺(Kyle) wechat
如有疑问可联系博主