繁体   English   中英

为什么当 GraphQL 查询只需要返回 object 的某些字段时,MySQL/Sequelize 执行完整的 select 查询?

[英]Why does MySQL/Sequelize perform full select queries when a GraphQL query only requires certain fields of an object to be returned?

对于我的应用程序中的用户,我有一个像这样的简单模式:

type Query {
  users: [User!]!
}

# The User ObjectType and Sequelize model.
type User implements UserI {
  id: ID!
  userName: String!
  firstName: String!
  lastName: String!
  email: String!
  createdAt: DateTime!
  updatedAt: DateTime!
  deletedAt: DateTime!
}

我的type-graphql解析器实现了这个简单的代码来返回users列表:

@Resolver()
class UserResolver {
  @Query(() => [User])
  async users(): Promise<User[]> {
    return User.findAll();
  }
}

当我执行这样的查询时:

{
  users {
    firstName
  }
}

我预计等效的 MySQL 查询将是这样的: SELECT firstName FROM users ,但我可以看到 Sequelize 将查询记录为:

Executing (default): SELECT `id`, `userName`, `firstName`, `lastName`, `email`, `password`, `createdAt`, `updatedAt` FROM `users` AS `User` WHERE (`User`.`deletedAt` IS NULL);

现在,虽然一切正常(我可以在客户端获取所有用户及其数据),但我想知道如果 Sequelize 执行完整的属性选择,服务器端是否有任何性能影响? 这是由于 Sequelize 还是仅仅由于 GraphQL 如何解析 model 字段? 我错过了一些选择吗?

我错过了一些选择吗?

您需要将 GraphQL 查询(请求)转换为正确的 SQL 查询。 只是调用findAll()没有关于请求的任何信息,所以它正确地获取了完整的实体。

基本上,您需要将 GraphQL Resolve Info 解析为更易读的格式(例如使用https://www.npmjs.com/package/graphql-fields ),然后为 TypeORM 构建一个select选项(例如.findAll({ select: ['id'] }) ).

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM