mysql - 当 GraphQL 查询只需要返回对象的某些字段时,为什么 MySQL/Sequelize 会执行全选查询?
问题描述
对于我的应用程序中的用户,我有一个像这样的简单模式:
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 如何解析模型字段?我错过了一些选择吗?
解决方案
我错过了一些选择吗?
您需要将 GraphQL 查询(请求)翻译成正确的 SQL 查询。只是调用findAll()
没有关于请求的任何信息,因此它正确地获取了完整的实体。
基本上,您需要将 GraphQL Resolve Info 解析为更易读的格式(例如使用https://www.npmjs.com/package/graphql-fields),然后select
为 TypeORM 构建一个选项(例如.findAll({ select: ['id'] })
)。
推荐阅读
- r - 在计算中删除带有 NA 的行,但使用 R 将它们保留在数据集中
- python - 当网站无法访问时,Python 会抛出错误
- regex - Bash 正则表达式似乎在简单匹配上失败了?
- heroku - Heroku 错误:无效要求:'_libgcc_mutex=0.1=conda_forge'
- math - 缩放旋转椭圆的 X 轴
- visual-studio - 无法使用 Visual Studio Live Share 在客户端启动项目窗口
- python-2.7 - pip install mock 有效,但 import mock 无效
- javascript - 如何通过 esri js 中的 javascript api 访问安全的 webscene(无需向用户询问凭据。)
- python - 当我在 python tkinter 中另存为 pdf 时,它显示错误
- docker - 在构建 VSCode 开发容器时使用主机网络