我使用 Prisma ( https://www.prisma.io ) 作为 ORM。我想在存储数据时检查重复项,如果不存在,则创建一个新记录。
我以为我可以使用 Prisma 提供的 upsert 方法来做到这一点,并且可以在生成的客户端中使用,但是该方法的 where 子句仅适用于 id(或 @unique 字段),但是如果记录不存在,则没有要提供的任何 ID。
我提供了一个问题的例子。
数据模型.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
}
Run Code Online (Sandbox Code Playgroud)
种子.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(); …Run Code Online (Sandbox Code Playgroud) 我想知道直接在解析器中使用 prisma 客户端或通过上下文传递它是否更好或者有什么区别。
在官方文档中它是通过上下文传递的:
const { prisma } = require('./generated/prisma-client');
const resolvers = {
Query: {
feed: (parent, args, context) => {
return context.prisma.posts({ where: { published: true } })
}
}
const server = new GraphQLServer({
typeDefs: './src/schema.graphql',
resolvers,
context: {
prisma,
},
})
Run Code Online (Sandbox Code Playgroud)
我的问题是:为什么 prisma 客户端不直接在解析器中使用。
const { prisma } = require('./generated/prisma-client');
const resolvers = {
Query: {
feed: (parent, args, context) => {
return prisma.posts({ where: { published: true } })
}
}
const server = new …Run Code Online (Sandbox Code Playgroud)