Как обновить новую запись в Prisma без идентификатора?

#node.js #prisma #prisma-graphql

#node.js #prisma #prisma-graphql

Вопрос:

Я использую Prisma (https://www.prisma.io ) как ORM. Я хочу проверить наличие дубликатов при сохранении данных и, если их не существует, создать новую запись.

Я думал, что смогу сделать это с помощью метода upsert, предоставляемого Prisma и доступного в сгенерированном клиенте, но предложение where этого метода работает только с id (или полями @unique), но если запись не существует, то нет никакого идентификатора для предоставления.

Я привожу пример проблемы.

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

  

Но возникает исключение:

Предупреждение о необработанном отказе: Ошибка: переменная ‘$ where’ ожидала значения типа ‘SystemPerformanceWhereUniqueInput!’, но получила: {«system»:{«name»:’s1′}, «date»: «2019-03-12T00:01:06.000Z»}. Причина: поле ‘system’ ‘system’ не определено в типе ввода ‘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
  }
})
  

Есть ли способ сделать это с помощью upsert?

Комментарии:

1. Upsert принимает только уникальные поля в качестве входных данных в where предложении. Я боюсь, вам придется пойти с обходным путем, когда вы запрашиваете record, а затем используете upsert или update / create в зависимости от того, существует ли запись.

2. Я этого боялся. Я спросил, есть ли лучшее решение. Спасибо за ваш ответ.

3. Один грязный взлом, который я использую, и он работает для меня, — это использование исходного значения для id, которого не существует: ` где: { id: id?? «не существует» }`

Ответ №1:

Поля в where должны быть уникальными.

Если вы можете создать какое-нибудь поле, скажем, date @unique ( date: DateTime! @unique ), и использовать его для вашего where в upsert, я думаю, это сработало бы (протестировано на моем локальном)

Ответ №2:

 where: {
    id: sysPerf[0].id ? sysPerf[0].id : 0
},
  

Комментарии:

1. Ваш ответ можно улучшить, добавив больше информации о том, что делает код и как это помогает операционной системе.