python - 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 根本不起作用。我做错了什么?
解决方案
从load_only
文档中:
指示对于特定实体,仅应加载给定的基于列的属性名称列表;所有其他人都将被推迟。
这里的“延迟”意味着剩余的列将被延迟加载;因此,在您的情况下,如果有人调用event.description
,届时将发出一个单独的 SQL 查询以从数据库中加载 description 列。
正确的解决方案实际上取决于您在下一层处理的内容:如果您希望 GraphQL 查询返回可以在 python 中使用的 SQLAlchemy 实体,那么当前行为可能正是您想要的 - 只是不要event.description
在您的代码中访问。如果您要构建返回 JSON 或类似内容的 API,则还需要告知序列化层从event
实体中提取哪些列。
推荐阅读
- ruby-on-rails - 在存储桶的特定文件夹中上传文件
- kubernetes - Fluentd+Kubernetes:基于标签隔离日志
- json - 访问深度嵌套字典中的数据
- linux - 使用 awk 或 sed 在每行的多列中将日期格式更改为修改后的 ISO 日期
- reactjs - 使用 Create React App 主题化语义 UI - 配置问题
- angular - 如何通过点击实现子组件与父组件的通信?
- h5py - 加速 H5 文件中的数据 I/O
- python - lambda 命令根据按下的按钮给出一个参数
- python-3.x - 使用 opencv 访问另一个系统的网络摄像头
- javascript - 将每个组件的根包装器设置为全身高度