Closed RobertCraigie closed 3 years ago
Is this feature available in v0.4?
I have been trying to use relation filter in where clauses but I keep getting Field does not exist on enclosing type.at
Query.findUniqueRole.where.RoleWhereUniqueInput.User.
I have tried it in some different ways:
@danielweil You need to wrap the relational field query with either is
or is_not
for one-to-one relations and either some
, none
or every
for one-to many / many-to-many relations.
In your case it should be:
role = await client.role.find_first(
where={
'User': {
'email': email,
},
},
)
Also it looks like you're using VSCode, if so you should definitely install the Pylance extension which will suggest the query arguments for you when you trigger auto-complete: https://github.com/RobertCraigie/prisma-client-py/blob/main/docs/showcase.gif
Thanks!
Do I have to apply any setting for the autocomplete to work? Here it still doesn't show up
You have to manually trigger autocomplete: https://code.visualstudio.com/docs/editor/intellisense#_intellisense-features
The Client
instance also has to be resolvable by the type checker, i.e. if you hover over it should say something like client: Client
It does not.
Ah so that's your problem, you need to annotate your get_client()
function to return prisma.Client
, e.g.
from prisma import Client
async def get_client() -> Client:
...
May I ask what your use case is for writing your own Client factory?
It already is.
Can this be related to my python running in WSL?
I am writing it because I use Azure AD postgres JWT access to database.
The issue might be with any part of DBClient.instance()
then, is that correctly resolved?
About find_first relational query: It gave this error message....
Failed to validate the query: Field does not exist on enclosing type.
at `Query.findFirstRole.where.RoleWhereInput.User.UserListRelationFilter.email
Can this be related to my python running in WSL?
I don't think so, I've used Python with WSL before without any issues
I am writing it because I use Azure AD postgres JWT access to database.
Ah I see, is this because you have to update the access token?
Failed to validate the query: Field does not exist on enclosing type. at `Query.findFirstRole.where.RoleWhereInput.User.UserListRelationFilter.email
@danielweil I'm so sorry I just realised I gave you the wrong query, it should be:
role = await client.role.find_first(
where={
'User': {
'is': {
'email': email,
},
},
},
)
Ah I see, is this because you have to update the access token?
Yep.
About the Client type, It is very weird why it doesn't work. Check this out!
That is bizarre, can you share how you're importing the client please?
Failed to validate the query: Field does not exist on enclosing type. at `Query.findFirstRole.where.RoleWhereInput.User.UserListRelationFilter.email
@danielweil I'm so sorry I just realised I gave you the wrong query, it should be:
role = await client.role.find_first( where={ 'User': { 'is': { 'email': email, }, }, }, )
Might be something here!
Failed to validate the query: Field does not exist on enclosing type.
at Query.findFirstRole.where.RoleWhereInput.User.UserListRelationFilter.is
That is bizarre, can you share how you're importing the client please?
Very
Failed to validate the query: Field does not exist on enclosing type. at Query.findFirstRole.where.RoleWhereInput.User.UserListRelationFilter.is
Ah sorry I missed that it was a list relation, replace is
with every
Failed to validate the query: Field does not exist on enclosing type. at Query.findFirstRole.where.RoleWhereInput.User.UserListRelationFilter.is
Ah sorry I missed that it was a list relation, replace
is
withevery
That worked out!
@danielweil Glad I could help!
About the Client type, does hovering over the import resolve correctly?
If that does, are you overriding the Client name anywhere?
It does not and I do not override it anywhere
That sounds like VSCode is using the wrong python interpreter then. Are you using a venv?
At the bottom left of your screen you should see something like this:
Click on the button that says Python ...
and select the python interpreter that you're using.
I opened VSCode in a remote session and now the imports show the correct class. By my get_client method still does not. I guess it is because of the async, but I can't get it to work.
On other hand, I have another issue with upsert:
I am trying to use it as a findOrCreate idea, but something in the where clause is causing an error:
Failed to validate the query: Field does not exist on enclosing type.
at `Mutation.upsertOneUser.where.UserWhereUniqueInput.email
Failed to validate the query: Field does not exist on enclosing type. at `Mutation.upsertOneUser.where.UserWhereUniqueInput.email
You need to add an @unique
to the email
field definition.
model User {
//
email String @db.VarChar(255) @unique
//
}
Failed to validate the query: Field does not exist on enclosing type. at `Mutation.upsertOneUser.where.UserWhereUniqueInput.email
You need to add an
@unique
to themodel User { // email String @db.VarChar(255) @unique // }
Thanks!
I opened VSCode in a remote session and now the imports show the correct class. By my get_client method still does not. I guess it is because of the async, but I can't get it to work.
Do you know what doesn't work? Is the Client
return type resolved correctly?
Not by my function:
How should it be with async functions in python? I tried Coroutine but failed.
The issue is that you've typed the instance()
function incorrectly. It needs to be typed to return whatever class implements the get_client()
method.
Thanks! worked perfectly
Failed to validate the query: Field does not exist on enclosing type. at `Query.findFirstRole.where.RoleWhereInput.User.UserListRelationFilter.email
@danielweil I'm so sorry I just realised I gave you the wrong query, it should be:
role = await client.role.find_first( where={ 'User': { 'is': { 'email': email, }, }, }, )
Might be something here!
Failed to validate the query:
Field does not exist on enclosing type.
atQuery.findFirstRole.where.RoleWhereInput.User.UserListRelationFilter.is
Thanks! worked perfectly
@danielweil how did you solve this ? we tried "is", and "every" according to the documents but we can't query based on relation fields? any suggestions?
@farzad-salimijazi I'm sorry you're encountering difficulties, could you share your schema and the query you're trying to write so I can offer some help :)
Problem
Currently only support nested filtering (through the include argument), this means that even if nothing matches the nested filter the base filter still passes, which could be confusing.
Suggested solution
Add relational fields to
WhereInput
, e.g.Additional context
Playground schema screenshot