TypeGraphQl 是不是自动格式化 SQL 查询?

Posted

技术标签:

【中文标题】TypeGraphQl 是不是自动格式化 SQL 查询?【英文标题】: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 【参考方案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这样的两个或多个端点

【讨论】:

以上是关于TypeGraphQl 是不是自动格式化 SQL 查询?的主要内容,如果未能解决你的问题,请参考以下文章

TypeGraphql 和 Prisma 2 类型冲突

如何使用 typegraphql-prisma 保护用户数据

使用 mercurius,使用 typegraphql 进行 fastify 会出错

使用 typegraphql (Apollo Server) 上传文件

有没有办法使用 TypeGraphQL 定义 GraphQL 片段?

typeGraphql 如何更改字段验证的消息