#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. Ваш ответ можно улучшить, добавив больше информации о том, что делает код и как это помогает операционной системе.