14

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
  }
})

アップサートでそれを行う方法はありますか?

4

2 に答える 2