Prisma2:如何用 Paljs 解决 n+1 问题 [英] Prisma2: How to solve n +1 Problem with Paljs

查看:36
本文介绍了Prisma2:如何用 Paljs 解决 n+1 问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

感谢您的帮助.

我在前端使用 apollo 客户端,在后端使用 graphql-nexus、prisma2 和 graphql-瑜伽服务器.

Im using at the frontend the apollo-client and at the backend graphql-nexus,prisma2 and graphql-yoga server.

我想用@paljs/plugins 解决 n + 1 问题.

I want to solve the n + 1 problem with @paljs/plugins.

在前端,我有一个查询帖子,例如:

At the frontend I have a query posts like:

query posts{
    posts {
        id
        favoritedBy(where: { id: { equals: $currentUserId } }) {
            id
        }
        author {
            id
            avatar {
                id
            }
        }
        link {
            id
        }
        games {
            id
        }
        tags {
            id
        }
        likes(where: { user: { id: { equals: $currentUserId } } }) {
            id
        }
    }
}

帖子解析器:

import { PrismaSelect } from '@paljs/plugins'
export const posts = queryField('posts', {
  type: 'Post',
  list: true,
  args: {
    ...
  },
  resolve: async (_parent, args, { prisma, request }, info) => {
    const select = new PrismaSelect(info).value
    let opArgs: FindManyPostArgs = {
      take: 10,
      orderBy: {
        [args.orderBy]: 'desc',
      },
      ...select
    }

    const post = await prisma.post.findMany(opArgs)
    
    //The result I want to return with the "sub-models" like likes, author tags...
    console.log(JSON.stringify(post, undefined, 2))

    return post
  },
})

我记录查询

const prisma = new PrismaClient({
  log: ['query'],
})

我的问题:使用 PrismaSelect,我有 5 个查询,如果我检查前端的请求时间,我需要使用 PrismaSelect 延长 300-400 毫秒.那么我做错了什么?我在 @paljs/plugins 文档中看到了上下文中的选择.也许那是我的错误.如何在上下文中使用选择?

My Problem: With PrismaSelect, I have 5 queries more than without and If I check the request-time at the frontend I need 300-400ms longer with PrismaSelect. So what I'm doing wrong? I saw in the @paljs/plugins doc the select in the context. Maybe that is my mistake. How can I use the select in the context?

这是我的背景:

import { PrismaClient, PrismaClientOptions } from '@prisma/client'
import { PubSub } from 'graphql-yoga'
import { PrismaDelete, onDeleteArgs } from '@paljs/plugins'

class Prisma extends PrismaClient {
  constructor(options?: PrismaClientOptions) {
    super(options)
  }

  async onDelete(args: onDeleteArgs) {
    const prismaDelete = new PrismaDelete(this)
    await prismaDelete.onDelete(args)
  }
}

export const prisma = new PrismaClient({
  log: ['query'],
})
export const pubsub = new PubSub()

export interface Context {
  prisma: PrismaClient
  request: any
  pubsub: PubSub
}

export function createContext(request: any): Context {
  return { prisma, request, pubsub }
}

推荐答案

你需要知道要使用我的 PrismaSelect 插件你需要删除 nexus-prisma-plugin 打包并使用我的 Pal.js CLI 为 nexus 创建您的 CRUD 和 ObjectType,并使用 @paljs/nexus 插件添加mackSchema 函数

You need to know that to use my PrismaSelect plugin you need to remove the nexus-prisma-plugin package and use my Pal.js CLI to create your CRUD and ObjectType for nexus and using @paljs/nexus plugin to add in mackSchema function

import { makeSchema } from '@nexus/schema';
import * as types from './graphql';
import { paljs } from '@paljs/nexus'; // import our plugin

export const schema = makeSchema({
  types,
  plugins: [paljs()],// here our plugin don't use nexus-prisma-plugin
  outputs: {
    schema: __dirname + '/generated/schema.graphql',
    typegen: __dirname + '/generated/nexus.ts',
  },
  typegenAutoConfig: {
    sources: [
      {
        source: require.resolve('./context'),
        alias: 'Context',
      },
    ],
    contextType: 'Context.Context',
  },
});

现在将此类型添加到您的Context

Now add this type to your Context

export interface Context {
  prisma: PrismaClient
  request: any
  pubsub: PubSub
  select: any // here our select type
}
export function createContext(request: any): Context {
// our paljs plugin will add select object before resolver
  return { prisma, request, pubsub, select: {} }
}

添加我们的插件后,您的查询将像这样记录

after you add our plugin your query will log like this


extendType({
  type: 'Query',
  definition(t) {
    t.field('findOneUser', {
      type: 'User',
      nullable: true,
      args: {
        where: arg({
          type: 'UserWhereUniqueInput',
          nullable: false,
        }),
      },
      resolve(_, { where }, { prisma, select }) {
// our plugin add select object into context for you
        return prisma.user.findOne({
          where,
          ...select,
        });
      },
    });
  },
});

您能否尝试使用我的 pal c 命令从我的列表中启动一个示例并尝试您的架构并使用它进行测试

Can you please try to use my pal c command to start an example from my list and try your schema and make tests with it

这篇关于Prisma2:如何用 Paljs 解决 n+1 问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆