graphene-python学习笔记(12)DataLoader
DataLoader是一个可用作应用程序数据提取的一部分,通过批处理和缓存在各种远程数据源(如数据库或Web服务)上提供简化且一致的API。用于防止出现多次请求。
1、批处理
示例:
from promise import Promise
from promise.dataloader import DataLoader
class UserLoader(DataLoader):
def batch_load_fn(self, keys):
# Here we return a promise that will result on the
# corresponding user for each key in keys
return Promise.resolve([get_user(id=key) for key in keys])
使用UserLoader
user_loader = UserLoader() user_loader.load(1).then(lambda user: user_loader.load(user.best_friend_id)) user_loader.load(2).then(lambda user: user_loader.load(user.best_friend_id))
一般的请求会发送四次,但是UserLoade最多发送两次,DataLoader可以合并请求。减少请求次数。
2、Using with Graphene
{
me {
name
bestFriend {
name
}
friends(first: 5) {
name
bestFriend {
name
}
}
}
}
如果直接请求,上面的请求可能会发生13次,但是使用user_loader
class User(graphene.ObjectType):
name = graphene.String()
best_friend = graphene.Field(lambda: User)
friends = graphene.List(lambda: User)
def resolve_best_friend(self, info):
return user_loader.load(self.best_friend_id)
def resolve_friends(self, info):
return user_loader.load_many(self.friend_ids)
最多请求4次。
浙公网安备 33010602011771号