我正在使用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,则尝试插入新的 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: Error: 变量 '$where' 期望类型为 'SystemPerformanceWhereUniqueInput!',但实际得到: {"system":{"name":'s1'},"date":"2019-03-12T00:01:06.000Z"}。原因:输入类型 'SystemPerformanceWhereUniqueInput' 中未定义 'system' 字段
我找到的唯一解决方案是检查存在性,然后进行更新或创建,但我想用 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
}
})
使用 upsert 有办法做到这一点吗?
where: { id: id ?? "不存在" }
。 - Kashif Nazar