我正在使用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
}
})
有没有办法做到这一点?
答案 0 :(得分:1)
where
中的字段必须唯一。
如果您可以建立一些字段,例如date
@unique(date: DateTime! @unique
),然后将其用于您在upsert中的位置,我认为它可以工作(在我的本地环境中测试)>