赞
踩
flask-sqlalchemy文档中有三种优化,此文章只写其中之一:
急切加载
回想一下,我们之前演示了延迟加载操作,当我们访问 a 的User.addresses集合User并发出 SQL 时。如果你想减少查询的数量(在很多情况下是显着的),我们可以对查询操作应用一个急切的负载。SQLAlchemy 提供三种类型的预加载,其中两种是自动的,第三种涉及自定义标准。这三个通常通过称为查询选项的函数调用,这些函数Query通过该方法为我们希望如何加载各种属性提供额外的说明Query.options()。
选择加载
在这种情况下,我们想指出User.addresses应该立即加载。加载一组对象及其相关集合的一个不错的选择是selectinload()选项,它发出第二个 SELECT 语句,完全加载与刚刚加载的结果关联的集合。名称“selectin”源于 SELECT 语句使用 IN 子句来一次定位多个对象的相关行的事实:
>>> from sqlalchemy.orm import selectinload >>> jack = session.query(User).\ ... options(selectinload(User.addresses)).\ ... filter_by(name='jack').one() SELECT users.id AS users_id, users.name AS users_name, users.fullname AS users_fullname, users.nickname AS users_nickname FROM users WHERE users.name = ? [...] ('jack',) SELECT addresses.user_id AS addresses_user_id, addresses.id AS addresses_id, addresses.email_address AS addresses_email_address FROM addresses WHERE addresses.user_id IN (?) ORDER BY addresses.id [...] (5,) >>> jack <User(name='jack', fullname='Jack Bean', nickname='gjffdd')> >>> jack.addresses [<Address(email_address='jack@google.com')>, <Address(email_address='j25@yahoo.com')>]
使用joinedload()预加载(可链式加载)
queryset = DeviceWarning.query.join(Device).filter(*filters)
count = queryset.count()
queryset = queryset.order_by(-DeviceWarning.create_time)\
.options(joinedload(DeviceWarning.device).joinedload(Device.groups)).paginate(page_num, page_size).items
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。