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 保护用户数据
使用 mercurius,使用 typegraphql 进行 fastify 会出错
使用 typegraphql (Apollo Server) 上传文件