首页 > 解决方案 > db.load_only 不过滤字段

问题描述

假设我们有简单的 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 根本不起作用。我做错了什么?

标签: pythonormsqlalchemygraphqlapollo

解决方案


load_only文档中:

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

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

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


推荐阅读