Prisma ( https://www.prisma.io ) を ORM として使用しています。データを保存するときに重複をチェックし、存在しない場合は新しいレコードを作成したい。
Prisma が提供し、生成されたクライアントで利用可能な upsert メソッドを使用してそれを実行できると考えましたが、そのメソッドの where 句は id (または @unique フィールド) でのみ機能しますが、レコードが存在しない場合は存在しません提供する任意の ID。
問題の例を示します。
データモデル.プリズマ
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
}
シード.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();
作成後、パフォーマンスのない 3 つのシステムを持つデータベースがあります。同じ日付と同じシステムがない場合、新しい 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: エラー: 変数 '$where' はタイプ 'SystemPerformanceWhereUniqueInput!' の期待値です! しかし得た: {"system":{"name":'s1'},"date":"2019-03-12T00:01:06.000Z"}. 理由: 'system' フィールド 'system' は入力タイプ 'SystemPerformanceWhereUniqueInput' で定義されていません
私が見つけた唯一の解決策は、存在を確認してから更新または作成することですが、アップサートでやりたかったのです。
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
}
})
アップサートでそれを行う方法はありますか?