【问题标题】:do TypeGraphQl automatic format the SQL query or not?TypeGraphQl 是否自动格式化 SQL 查询?
【发布时间】:2021-11-02 10:06:10
【问题描述】:

我将 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?

【问题讨论】:

  • TypeGraphQL 对 SQL 一无所知。如果您不告诉 TypeORM(您没有),TypeORM 不知道只获取 id 和 name。为此,consider using Postgraphile

标签: javascript express graphql typeorm typegraphql


【解决方案1】:

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 装饰器在 this 上做了很多工作

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多