首页 > 解决方案 > TypeGraphQl 是否自动格式化 SQL 查询?

问题描述

我将 typeorm 与 TypeGraphQl 结合使用。我想知道TypeGraphQl提供的SQL查询结果是什么

例如,如果我有一个包含很多列的用户表,并且我有这个简单的解析器。

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

在客户端,他们像这样请求用户数据

{
  user{
    id,
    name
  }
}

SQL 将向数据库运行什么。

这是这个吗

"SELECT * FROM USER";

或者这个

"SELECT id, name FROM USER";

如果它运行第一个 SQL,那么为什么我需要首先使用 GraphQl?不是休息更好。

或者如何根据用户请求制作动态 SQL?

标签: javascriptexpressgraphqltypeormtypegraphql

解决方案


GraphQl 用于动态字段请求,例如假设您的数据库中有一个用户表,其中包含 Id_User、电子邮件、名称,并且您只想查询 Id_User

所以你的查询看起来像这样

 {
  GetUser{
    id
  }
} 

如果在你的解析器中你这样做:

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

Typeorm whit 生成如下查询:

"SELECT Id_User, Name, Email FROM USER"

即使您没有选择所有数据并且您的查询只有一个字段 typeorm 也会选择所有字段。

如果您想避免这种情况并且只想使用“Id_User 字段”发出请求,您需要知道解析器返回的字段是什么,而您使用 typegraphql 中的 @Info 装饰器会为此付出很多

此外,typeorm 有一个查询生成器功能,可以帮助您制作动态 SQL 语句

为什么 ?并且 REST 更好?,实际上 REST 你无法选择你想要的字段,GraphQl 是为这些问题而设计的,当你有一个 web、应用程序、桌面应用程序时,你需要对你制作 GraphQl API 的所有平台进行不同的查询,因为只有一个像GetUser这样的端点,您可以动态选择字段,不需要像rest api这样的两个或多个端点


推荐阅读