flask-sqlalchemy - 在不同的情况下改变懒惰

问题描述 投票:1回答:1

以文档中的示例为例

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50), nullable=False)
    addresses = db.relationship('Address', lazy='dynamic',
        backref=db.backref('person', lazy='select'))

我们只能在构建模型时将惰性参数设置为关系。但我发现没有文档显示如何在实例化后更改它。

在我的大多数情况下

user = User.query.first()
addresses = user.addresses.filter(is_del=0).all()

这是一对多或

wallet = user.wallet

这是一对一的模型,我只是将懒惰设置为动态或选择让模型只获取我需要的数据。

但是最近我想使用管理员前端页面导出数据库中的数据。

user_list = UserModel.query.all()
for x in user_list:
    item = {
        "ID": x.id if x.id else ''
    }
    if 'basic' in fields or is_all_field == 1:
        ex_item = {
            "Email": x.base.account,
            "Full Name": x.base.full_name,
            "Display Name": x.display_name if x.display_name else '',
            "Phone Number": x.base.phone_number if x.base.phone_number else '',
            "Status": status_map(x.is_sharer,x.is_block,x.status_id)
            "Register Time": x.create_date.strftime('%Y-%m-%d %H:%M:%S') if x.create_date else ''
        }
        item = {**item, **ex_item}
    if ......
    ........

如果我继续使用select和dynamic作为懒惰。每次使用子查询时父查询将访问数据库的每个循环都会非常慢。

我使用像"Full Name": x.base.full_name这样的单个字段来测试select和join之间的速度,以导出所有用户数据。选择得到53s并加入得到0.02s。

有没有办法在不更改原始模型的基础上更改延迟参数?

flask sqlalchemy flask-sqlalchemy
1个回答
0
投票

根据documentation,你可以使用options来定义你想要的加载类型。我相信它会覆盖您在关系中定义的默认值

有用的链接

Joined Loads

Select Loads

Lazy Load

© www.soinside.com 2019 - 2024. All rights reserved.