SQLAlchemy 的惰性查询



Flask中的Sqlalchemy, 很多人对数据库关系db.relations()时里面的lazy这个参数很模糊。

比如说,在一对多模型中:back回复-comment评论(一个回复可以有多个评论)

外键(多方):comment_id = db.Column(db.Integer, db.ForeignKey("info_comment.id"))

关系属性(一方):back_list=db.relationship('Comment',lazy='dynamic',backref='comment')

这个里面就用到了lazy='dynamic'

什么意思呢?在官方文档中,我把英文翻译成中文:

dynamic表示在访问属性的时候,并没有在内存中加载数据,而是返回一个query对象, 需要执行相应方法才可以获取对象,比如.all().下面结合实例解释这几个的使用场景。

班级与学生:

students = db.relationship('Student', backref='_class', lazy="dynamic")#放在一方的关系属性

>>> from app.models import Student as S, Class as C

>>> s1=S.query.first()

>>> c1=C.query.first() #班级对象

>>> c1.students #班级对象对应的学生,是一个query对象

<sqlalchemy.orm.dynamic.AppenderBaseQuery object at 0x7f007d2e8ed0>

>>> c1.students.all()#使用.all()才出来具体的学生对象

[<Student: u'test'>, <Student: u'test2'>, <Student: u'test3'>]

讲到这里应该懂了吧,

其实lazy属性默认的是lazy="select",它默认返回最终结果,等同于上面的.all()

最终要说的是:lazy是用在一对多的一和多对多 非中间表 中的,这只是lazy的两个属性,还有另外两个,总共四个属性


看下官方说明吧:

lazy 决定了 SQLAlchemy 什么时候从数据库中加载数据:,有如下四个值:(其实还有个noload不常用)

select: (which is the default) means that SQLAlchemy will load the data as necessary in one go using a standard select statement.

joined: tells SQLAlchemy to load the relationship in the same query as the parent using a JOIN statement.

subquery: works like ‘joined’ but instead SQLAlchemy will use a subquery.

dynamic : is special and useful if you have many items. Instead of loading the items SQLAlchemy will return another query object which

you can further refine before loading the items. This is usually what you want if you expect more than a handful of items for this relationship

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • rljs by sennchi Timeline of History Part One The Cognitiv...
    sennchi阅读 7,424评论 0 10
  • MySQL 命令大全 DDL(数据定义语句) CREATE TABLE/DATABASE ALTER TABLE/...
    子非初心阅读 3,464评论 0 2
  • 1. Flask模型 Flask默认并没有提供任何数据库操作的API(Application Programmin...
    十二右阅读 543评论 0 0
  • 不知不觉时间过得真快,母亲离开我们已经三年了,明天就是母亲逝世三周年纪念日。此刻,我心里好乱,十分压抑悲伤。...
    老徐家的小七阅读 376评论 0 0
  • 最近确实不知道写什么,整理一篇很受欢迎的TED演讲吧吧——“20岁光阴不再来”。附上视频链接,肯定都比较眼熟的——...
    Jessie8304阅读 651评论 0 1