【问题标题】:flask-sqlalchemy - change lazy in different situationsflask-sqlalchemy - 在不同情况下改变懒惰
【发布时间】:2018-09-10 01:11:34
【问题描述】:

以文档为例

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'))

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

在我的大多数情况下,例如

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

这是一对多或

wallet = user.wallet

这是一对一模型,我只是将 lazy 设置为 dynamic 或 select 让模型只获取我需要的数据。

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

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 作为 lazy。这将非常非常慢,因为父查询每次使用子查询时都会访问数据库。

我使用"Full Name": x.base.full_name 之类的单个字段来测试selectjoined 之间的速度,以导出所有用户数据。 Select 得到 53s,joined 得到 0.02s。

有没有办法在不改变原有Model的基础上改变lazy参数?

【问题讨论】:

    标签: flask sqlalchemy flask-sqlalchemy


    【解决方案1】:

    所以,基本上,如果您使用lazy=' select',延迟加载,并希望切换到joinedload 来优化您的查询,请使用以下内容:

    from sqlalchemy.orm import joinedload  # import the joinedload 
    user_list = db.session.query(UserModel).options(joinedload("person"))  # running a joinedload which will give you access to all attributes in parent and child class 
    for x in user_list: 
        # now use x.account directly
    

    【讨论】:

      【解决方案2】:

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

      有用的链接

      Joined Loads

      Select Loads

      Lazy Load

      【讨论】:

      • 谢谢,它很有帮助。我只是将 flask-sqlalchemy 文档的重点放在了 sqlalchemy 的文档上。
      • 根据文档,使用flask-sqlalchemy应该是User.query.options(joinedload(User.addresses, innerjoin=True)).all()
      • @Hustwhw 嗨,你有没有想过这个问题?当我运行您的查询时,我得到“用户不支持对象填充 - 无法应用急切加载。”
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-22
      • 1970-01-01
      • 2011-07-09
      • 2015-09-06
      • 2012-11-04
      • 2020-11-11
      相关资源
      最近更新 更多