【问题标题】:db.load_only does not filter the fieldsdb.load_only 不过滤字段
【发布时间】:2020-06-28 11:09:13
【问题描述】:

假设我们有简单的 graphql-query:

 query EventQuery {
    event(id: 1) {
      id
      name
      description
  }
}

我们的resolve方法是这样的:

    def resolve_event(self, info, id):
        event = (Event.get_query(info).filter_by(id=id).options(db.load_only('id', 'name'))).first()
        return event

    def resolve_event(self, info, id):
        event = db.session.query(EventModel).filter_by(id=id).options(db.load_only('id', 'name')).first()
        return event

在这两种情况下,resolver 都会返回 id、name 和 description,db.load_only 根本不起作用。我做错了什么?

【问题讨论】:

    标签: python orm sqlalchemy graphql apollo


    【解决方案1】:

    来自load_only 文档:

    指示对于特定实体,仅应加载给定的基于列的属性名称列表;所有其他人都将被推迟。

    这里的“延迟”意味着剩余的列将被延迟加载;因此,在您的情况下,如果有人调用 event.description,届时将发出单独的 SQL 查询以从数据库中加载描述列。

    正确的解决方案实际上取决于您在下一层处理的内容:如果您希望 GraphQL 查询返回可以在 python 中使用的 SQLAlchemy 实体,那么当前行为可能正是您想要的 - 只是不要在您的代码中访问event.description。如果您要构建返回 JSON 或类似内容的 API,则还需要告知序列化层从 event 实体中提取哪些列。

    【讨论】:

      猜你喜欢
      • 2013-12-20
      • 1970-01-01
      • 2012-03-21
      • 1970-01-01
      • 2023-03-25
      • 2016-06-15
      • 2021-06-19
      • 2019-08-17
      • 1970-01-01
      相关资源
      最近更新 更多