Flask ORM
ORM操作
-
模型类创建、迁移生成表
-
数据操作
-
增: 模型类创建对象、添加对象到 session事务、提交事务
-
删: 先通过条件查询,然后删除, 最后 同样需要 提交事务
-
改: 先通过条件查询,然后修改, 最后 同样需要 提交事务
-
查:
get(值): 查询结果是一个对象,不存在,结果为Nonefilter_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")

浙公网安备 33010602011771号