将数据导入到Prisma / PostgreSQL服务的最有效方法?

时间:2018-08-23 17:15:40

标签: postgresql prisma

我有一个Prisma(1.14.2)服务正在运行,该服务已附加到PostgreSQL数据库。我需要通过Prisma连接器插入许多与PostgreSQL数据库具有一对多关系的节点。现在,我以以下方式进行操作。 strokessamples数组包含许多节点:

for (let strokeIndex = 0; strokeIndex < painting.strokes.length; strokeIndex++) {
    const stroke = painting.strokes[strokeIndex];
    const samples = stroke.samples;
    const createdStroke = await PrismaServer.mutation.createStroke({
        data: {
            myId: stroke.id,
            myCreatedAt: new Date(stroke.createdAt),
            brushType: stroke.brushType,
            color: stroke.color,
            randomSeed: stroke.randomSeed,
            painting: {connect: {myId: jsonPainting.id}},
            samples: { create: samples }
        }
    });
}

对于128个笔划和每个笔划128个样本(即总共16348个样本)这大约需要38秒

我想知道是否有办法加快这一过程?特别是由于笔画和样本的数量会更高。我可以使用prisma import ...,它显示出6倍的加速。但我想避免转换为Normalized Data Format (NDF)

我读过有关加快PostgreSQL in general中的INSERT的信息,但是我不确定是否以及如何将其应用于Prisma连接器。

2 个答案:

答案 0 :(得分:0)

往返(查询您的API,查询您的数据库并返回值)需要很多时间。 实际上,它肯定比实际的SQL查询花费更多的时间。

要解决您的问题,您可能应该批处理您的查询。有很多方法可以执行此操作,您可以使用GraphQL查询批处理程序包,也可以像这样简单地进行操作:

mutation {
  q1: createStroke(color: "red") {
    id
  }
  q2: createStroke(color: "blue") {
    id
  }
}

请记住,Prisma will time out queries taking longer than 45s,因此您可能希望限制批次的大小。

给出n每批查询的数量,它将往返次数除以n。

答案 1 :(得分:0)

从 Prisma 版本 2.20.0 开始,您现在应该可以使用 .createMany({})。 自从您 3 年前问过以来,这个答案可能没有帮助...

https://www.prisma.io/docs/concepts/components/prisma-client/crud#create-multiple-records