如何在没有ID的Prisma中刷新新记录?

时间:2019-03-28 18:35:26

标签: node.js prisma prisma-graphql

我正在使用Prisma(https://www.prisma.io)作为ORM。我想在存储数据时检查重复项,如果不存在,请创建一个新记录。

我认为我可以使用Prisma提供的upsert方法来完成此操作,并且该方法可以在生成的客户端中使用,但是该方法的where子句仅适用于id(或@unique字段),但是如果记录不存在,则存在没有要提供的ID。

我提供了一个问题的例子。

datamodel.prisma

type System {
  id: ID! @unique
  performances: [SystemPerformance!]! @relation(name: "PerformanceBySystem" onDelete: CASCADE)
  name: String! @unique
}

type SystemPerformance {
  id: ID! @unique
  system: System! @relation(name: "PerformanceBySystem")
  date: DateTime!
  perf1: Float
  perf2: Float
}

seed.js

const { prisma } = require('./generated/prisma-client');
async function main(){
  await prisma.createSystem({
    name: 's1',
  });
  await prisma.createSystem({
    name: 's2',
  });
  await prisma.createSystem({
    name: 's3',
  });
}
main();

创建后,有一个数据库,其中包含三个没有性能的系统。如果没有相同的日期和相同的系统,我将尝试插入新的SystemPerformance。我尝试过

const { prisma } = require('./prisma/generated/prisma-client');

const perf = await prisma.upsertSystemPerformance({
       where: {
         system: {name: 's1'},
         date: "2019-03-12T00:01:06.000Z"
       },
       update: {
         perf1: 13.45,
         perf2: 18.93
       },
       create: {
        system: {
            connect: { name: 's1' }
        },
        date: "2019-03-12T00:01:06.000Z",
        perf1: 13.45,
        perf2: 18.93
       }
})

但是会引发异常:

UnhandledPromiseRejectionWarning:错误:类型“ SystemPerformanceWhereUniqueInput!”的变量“ $ where”的期望值!但得到:{“ system”:{“ name”:'s1'},“ date”:“ 2019-03-12T00:01:06.000Z”}。原因:在输入类型“ SystemPerformanceWhereUniqueInput”中未定义“系统”字段“系统”

我发现的唯一解决方案是检查是否存在,然后进行更新或创建,但是我想通过upsert来完成。

let check = await prisma.$exists.SystemPerformance({
            system: {name: 's1'},
            date: "2019-03-12T00:01:06.000Z"
        });
let perfo;
if (check){
  const sysPerf = await prisma.systemPerformances({where:{system: {name: 's1'}, date: "2019-03-12T00:01:06.000Z"}})
            .$fragment(`
            {
                id
            }
            `);
  perfo = await prisma.updateSystemPerformance({
    where: {id: sysPerf[0].id},
            data: {
              perf1: 13.45,
              perf2: 18.93
            }
   })
}
else {
  perfo = await prisma.createSystemPerformance({
    system: {
      connect: { name: 's1' }
    },
    date: "2019-03-12T00:01:06.000Z",
    perf1: 13.45,
    perf2: 18.93
  }
})

有没有办法做到这一点?

1 个答案:

答案 0 :(得分:1)

where中的字段必须唯一。

如果您可以建立一些字段,例如date @unique(date: DateTime! @unique),然后将其用于您在upsert中的位置,我认为它可以工作(在我的本地环境中测试)