在 prisma 中循环替换查询

Posted

技术标签:

【中文标题】在 prisma 中循环替换查询【英文标题】:Replacing queries in a loop in prisma 【发布时间】:2021-10-21 08:28:26 【问题描述】:

我有一个 API 端点需要获取 30 个项目的数据,它需要检查两个不同字段中的值以返回正确的字段。我正在使用 Prisma ORM。

在一个请求中,我得到一个对象数组,如下所示:


 '6151': 12
,

其中key是part_num,value是color_id。我将键和值分成数组,并在循环中逐个查找每个元素:

  const elements = [];
  for (let i = 0; i < partNums.length; i++) 
    const element = await prisma.elements.findFirst(
      where:  AND:  part_num: partNums[i], color_id: colors[i]  ,
    );
    elements.push(element);
  

它似乎工作正常,但我读到对数据库进行多次查询是一种不好的做法,所以我的问题是:

有没有办法在一个查询中获得相同的结果?

我唯一的想法是仅通过其中一个字段获取所有元素,然后过滤掉我不需要的那些。但是,这首先需要从 db 中获取更多元素,并且过滤也需要一些时间。

【问题讨论】:

【参考方案1】:

您可以使用单个 findMany 查询。您需要在循环中生成where 条件。它将是一组OR 条件,每个条件指定一个Element 记录。

这里有一些 cmets 的代码来解释它的作用

    let findManyOrCondition = [];  // each entry will contain a single part_nums, color_id condition pair.

    for (let i = 0; i < partNums.length; i++) 
        // AND condition between part_num and color_id is implicit
        findManyOrCondition.push( 
            part_num: partNums[i], 
            color_id: colors[i],
        );
    
    
    // fetch all of the elements with one query. 
    const elements = await prisma.elements.findMany(
        where: 
            OR: findManyOrCondition,
        ,
    );

【讨论】:

现在看起来很明显......这正是我想要的,谢谢! 欢迎,乐于助人:D

以上是关于在 prisma 中循环替换查询的主要内容,如果未能解决你的问题,请参考以下文章

如何替换 snowflake.execute 语句中的循环结果?

使用 MongoDB API 无法使用 Prisma 和 CosmosDB 进行更新

Python:替换多个 for 循环、多个迭代器

如何在熊猫中使用 python 循环替换缺失值? [关闭]

在 FOR 循环批处理语法中使用变量进行字符串替换

在Python中替换深层循环