Flask ORM

ORM操作

  • 模型类创建、迁移生成表

  • 数据操作

  • 增: 模型类创建对象、添加对象到 session事务、提交事务

  • 删: 先通过条件查询,然后删除, 最后 同样需要 提交事务

  • 改: 先通过条件查询,然后修改, 最后 同样需要 提交事务

  • 查:

    • get(值): 查询结果是一个对象,不存在,结果为 None
    • filter_by(字段=值): 结果是一个 查询集,找不到,当做一个空列表,因此,需要循环解析
    • get_or_404(值): 存在,结果就是 对象,不存在,返回 404状态码
    • filter(模型类.字段 > 值) : 支持所有的比较运算符
    • filter(模型类.字段.like('%{}%'.format(text))): 支持模糊查询,根据变量 text的数据变化而变化
      -filter(模型类.字段.in_(数据范围)):查询在某个范围内的数据
    • filter(Student.age >= 10, Student.age <= 30) : 查询 10到30之间的所有学生
    • filter(and_(Student.age >= 10, Student.age <= 30)) : 查询 10到30之间的所有学生
    • filter(or_(Student.age < 10, Student.age >30)) : 查询 小于10岁或 大于 30 的学生
    • 查询集.order_by(字段): 指定按照字段升序排序
    • 查询集.order_by(desc(字段)): 指定按照字段降序排序
    • pagination = 查询集.paginate(page=xxx, per_page=xxx): 结果是一个分页器对象
      • 当前页的数据: pagination.items
      • 总的记录数量: pagination.total
      • 总的页码: pagination.pages

  • 通过班级名或者 学生名进行搜索,得到 学生信息,包括班级名
    students = Student.query.join( Class, Class.id==Student.class_id) .filter(or_(Student.name.like('%{}%'.format(text)),
Class.name.like('%{}%'.format(text))  ))  #查询结果仍然是 学生对象,想要对应的班级信息,需要通过外键的关系查询

在有关系的两表中,需要重新的条件 处于 不同的表中,需要 先将两表 链接,然后再使用 filter 过滤

数据关系

一对多

# 班级和学生, 外键关联

多对多

# 作者表 : 设置一个关系字段 books
# 图书表
# 作者和图书的关系表: 图书外键、作者外键
  • 想要查询 某个作者的图书, 如果设置过 关系字段之后, 查询图书,不需要经过 第三张表,可以 使用 关系字段,直接得到 对应的 图书查询集
  • 通过 图书 查询 作者, 属于 反向查询集,也可以直接查询

一对一

# boy
# 1    李磊    男   1
# 2    Lucy    男   2

class Boy(db.Model):
    __tablename__ = 'boy'
    id = db.Column(db.Integer, primary_key=True, auto_incremenet=True)
    name = db.Column(db.String(20))
    gender = db.Column(db.String(5),  default='男')
    girl_id  = db.Column(db.Integer, db.ForeignKey('girl.id'), unique=True)
    girl = db.relationship('Girl', backref='boy')
    
# girl               
# 1   韩梅梅    女   
# 2   Lily     女   
class Girl(db.Model):
    __tablename__ = 'girl'
    id = db.Column(db.Integer, primary_key=True, auto_incremenet=True)
    name = db.Column(db.String(20))
    gender = db.Column(db.String(5),  default='女')
    # boy_id  = db.Column(db.Integer, db.ForeignKey('boy.id'), unique=True)

一对多和一对一 类似,只是 一对多的外键进行 唯一约束

自关联

自关联 是 一对多 的 特殊情况

class Cate(db.Model):
    __tablename__ = 'tb_cate'
    id = db.Column(db.Integer, autoincrement=True, primary_key=True)
    name = db.Column(db.String(10))

    # 外键,关联自身的主键
    parent_id = db.Column(db.Integer, db.ForeignKey('tb_cate.id'), nullable=True)

    # 指明关联字段,和实质的表无关系,只是在查询时,实现关联查询
    parent = db.relationship('Cate', remote_side=[id], backref="sub")
posted @ 2021-05-27 14:00  罗万  阅读(185)  评论(0)    收藏  举报