Flask中使用flask-sqlalchemy时急切加载(预加载,类似django中的select_related和prefetch_related方法)减少sql对其优化

1 篇文章 0 订阅

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值