mysql - 当 GraphQL 查询只需要返回对象的某些字段时,为什么 MySQL/Sequelize 执行全选查询?

标签 mysql express graphql sequelize.js typegraphql

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

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 如何解析模型字段?我错过了一些选择吗?

最佳答案

Am I missing some options?


您需要将 GraphQL 查询(请求)转换为正确的 SQL 查询。只是调用 findAll() 没有关于请求的任何信息,所以它正确地获取了完整的实体。
基本上,您需要将 GraphQL Resolve Info 解析为更易读的格式(例如使用 https://www.npmjs.com/package/graphql-fields ),然后为 TypeORM 构建 select 选项(例如 .findAll({ select: ['id'] }) )。

关于mysql - 当 GraphQL 查询只需要返回对象的某些字段时,为什么 MySQL/Sequelize 执行全选查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63136051/

相关文章:

mysql - 如何提高从一个数据库服务器中选择 100 万多行并将它们插入到另一个数据库服务器的 Perl/DBI 脚本的性能?

MySql 数据透视表或连接问题

reactjs - 如何在开发模式下检查 SEO 元标记?

graphql - AWS Appsync Javascript 查询示例和输入语法

github - 如何使用 github graphQL 获取有关特定用户的信息?

mysql - 如何在mysql中进行嵌套选择查询

php - 如何将用户从下拉选择框列表中选择的选项的值存储到 mysql 数据库中?

CSS 背景图像未使用 webpack 加载

javascript - 如何从 nodejs 中的多步骤表单发布数据并表达到 MongoDB?

graphql - 如何使用 graphql-tools 使用或解析枚举类型?