Issue: Nested CreateWithout[Relation]Input requires mandatory ID fields despite create or connectOrCreate usage
StephanDecker opened this issue · comments
Great work! Before updating to the official 1 release it worked smoothly. After updating it seems that ID fields that are auto-populated by the database are mandatory when executing the create* mutations. That means: When creating a record I have to handover the id although the id is autogenerated in the database:
Here is the example:
schema.prisma:
model Phase {
id String @id @default(uuid())
name String @unique
}
...?
generated schema.gql (using 1.0.0-rc.5):
input PhaseCreateInput {
name: String!
}
generated schema.gql (after upgrade to 1.0.1):
input PhaseCreateInput {
id: String!
name: String!
}
Could you fix that? Thanks!
PS: That issue has been already solved in an earlier version: #62
Thanks @StephanDecker ! Using v1.0.1, with the below Prisma model:
model Phase {
id String @id @default(uuid())
name String @unique
}
The GraphQL output I get is:
input PhaseCreateInput {
id: String
name: String!
}
Which is expected to both allow you to create with or without specifying id
.
What version of Prisma Client are you using? (it should display when running npx prisma generate
)
Yes, depending on the field definition (e.g. autoincrement
or uuid
) it should create the record with or without specifying id.
In my example it should be:
input PhaseCreateInput {
name: String!
}
That has been already been implemented in a nice way before, see this commit:
bc7320d
Or this code here:
prisma-appsync/packages/generator/src/compiler.ts
Lines 683 to 691 in bc7320d
But I don't know where to put it now (after the refactoring) ;-)
Version details:
Prisma Client (v5.7.1)
Prisma-AppSync (1.0.1)
Hey @StephanDecker, not having id
entirely in the output was a mistake that's been fixed as part of the v1.0.0 release.
However, you should be able to create a record with or without specifying id
.
On my end, the generated GraphQL output is the correct one:
input PhaseCreateInput {
id: String
name: String!
}
The above allows you to either specify or omit id
entirely.
Could you please double-check that the output on your end is id: String!
and not id: String
as in my example above?
Sorry, you are completely right. I tried to simplify the problem which is different and didn't work. Unfortunately it's more complicated.
Let's say you have these models:
model ExampleTable {
id String @id @default(uuid())
refTable RefTable[]
}
model RefTable {
id String @id @default(uuid())
downstreamRefTable DownstreamRefTable @relation(fields: [downstreamRefTableId], references: [id])
downstreamRefTableId String
exampleTable ExampleTable @relation(fields: [exampleTableId], references: [id])
exampleTableId String
}
model DownstreamRefTable {
id String @id @default(uuid())
name String @unique
refTable RefTable[]
}
It will generate this in schema.gql
type Mutation {
createExampleTable(
data: ExampleTableCreateInput!
): ExampleTable!
}
input ExampleTableCreateInput {
id: String
refTable: ExampleTableRefTableCreateNestedInput
}
input ExampleTableRefTableCreateNestedInput {
connect: [RefTableWhereUniqueInput!]
create: [RefTableCreateWithoutExampleTableInput!]
connectOrCreate: [RefTableConnectOrCreateWithoutExampleTableInput!]
}
input RefTableCreateWithoutExampleTableInput {
id: String
downstreamRefTable: RefTableDownstreamRefTableCreateNestedInput
downstreamRefTableId: String!
}
The downstreamRefTableId: String!
is now mandatory but it shouldn't because we have the downstreamRefTable as a reference (either by connect, create or connectOrCreate).
Got it! @StephanDecker could you please install prisma-appsync@1.0.2-preview.1
and let me know if that resolves the issue on your end?
To clarify, this issue is specifically about the requirement of mandatory ID fields in the nested CreateWithout[Relation]Input
, even when using connect
or connectOrCreate
, correct? This isn't related to the @default
directives or the CreateInput
itself?
You can have a look at the fix here: e1a4ea7
Thanks a lot for the quick fix!!
To clarify, this issue is specifically about the requirement of mandatory ID fields in the nested CreateWithout[Relation]Input, even when using connect or connectOrCreate, correct? This isn't related to the @default directives or the CreateInput itself?
Exactly, it's about the mandatory ID fields in the nested CreateWithout[Relation]Input
. Sorry for the confusion before, I mixed that up. I tested the prisma-appsync@1.0.2-preview.1
fix and the errors are gone. :-)
Thanks for confirming @StephanDecker! Fix was released as part of v1.0.2.