python - 将 prisma graphql 查询与 ariadne 集成
问题描述
我已经编写了一些 graphql 模式并使用 prisma 部署它。Prisma 生成了一些.graphql
文件type Query
,type Mutation
,type Subscription
。有一个从 docker 运行的 prisma 服务器正在连接 MySQL 数据库。现在我想使用 Ariadne 编写一些 API 函数并使用 Prisma 查询联系数据库。我怎样才能做到这一点?
提供给 prisma 的 GraphQL Schema
datamodel.prisma
type User {
id: ID! @id
name: String!
}
生成的 graphql 文件示例
prisma.graphql
type Query {
user(where: UserWhereUniqueInput!): User
users(where: UserWhereInput, orderBy: UserOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): [User]!
usersConnection(where: UserWhereInput, orderBy: UserOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): UserConnection!
node(id: ID!): Node
}
使用 ariadne 尝试连接到数据库的 API 代码片段
我正在尝试执行users
查询,即从数据库中获取所有用户。
api.py
from ariadne import gql, load_schema_from_path, QueryType, make_executable_schema
from ariadne.asgi import GraphQL
schema_files_path = "/root/manisha/prisma/generated/prisma.graphql"
schema = load_schema_from_path(schema_files_path)
query = QueryType()
@query.field("users")
def resolve_users(_, info):
...
schema = make_executable_schema(schema, query)
app = GraphQL(schema, debug=True)
使用 uvicorn 运行服务器
uvicorn api:app --reload --port 7000
我可以使用以下查询在 prisma playground 中获得所有用户。
{
users{
name
id
}
}
用于从数据库中获取所有用户的 prisma playground 的屏幕截图
用 ariadne 做同样的尝试resolve_users
解析器尝试同样的方法是行不通的。
给我以下错误:
ERROR: Expected Iterable, but did not find one for field Query.users.
GraphQL request (2:3)
1: {
2: users {
^
3: id
Traceback (most recent call last):
File "/usr/local/lib/python3.6/dist-packages/graphql/execution/execute.py", line 675, in complete_value_catching_error
return_type, field_nodes, info, path, result
File "/usr/local/lib/python3.6/dist-packages/graphql/execution/execute.py", line 750, in complete_value
result,
File "/usr/local/lib/python3.6/dist-packages/graphql/execution/execute.py", line 766, in complete_value
cast(GraphQLList, return_type), field_nodes, info, path, result
File "/usr/local/lib/python3.6/dist-packages/graphql/execution/execute.py", line 807, in complete_list_value
"Expected Iterable, but did not find one for field"
TypeError: Expected Iterable, but did not find one for field Query.users.
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "/usr/local/lib/python3.6/dist-packages/graphql/execution/execute.py", line 351, in execute_operation
)(type_, root_value, path, fields)
File "/usr/local/lib/python3.6/dist-packages/graphql/execution/execute.py", line 441, in execute_fields
parent_type, source_value, field_nodes, field_path
File "/usr/local/lib/python3.6/dist-packages/graphql/execution/execute.py", line 612, in resolve_field
field_def.type, field_nodes, info, path, result
File "/usr/local/lib/python3.6/dist-packages/graphql/execution/execute.py", line 688, in complete_value_catching_error
self.handle_field_error(error, field_nodes, path, return_type)
File "/usr/local/lib/python3.6/dist-packages/graphql/execution/execute.py", line 703, in handle_field_error
raise error
File "/usr/local/lib/python3.6/dist-packages/graphql/execution/execute.py", line 675, in complete_value_catching_error
return_type, field_nodes, info, path, result
File "/usr/local/lib/python3.6/dist-packages/graphql/execution/execute.py", line 750, in complete_value
result,
File "/usr/local/lib/python3.6/dist-packages/graphql/execution/execute.py", line 766, in complete_value
cast(GraphQLList, return_type), field_nodes, info, path, result
File "/usr/local/lib/python3.6/dist-packages/graphql/execution/execute.py", line 807, in complete_list_value
"Expected Iterable, but did not find one for field"
graphql.error.graphql_error.GraphQLError: Expected Iterable, but did not find one for field Query.users.
解决方案
由于 prisma 还不支持 python 客户端,下面的代码有助于作为从 Ariadne 联系 prisma 服务器的解决方法。
from ariadne import gql, load_schema_from_path, QueryType, make_executable_schema
from ariadne.asgi import GraphQL
import requests
prisma_url = "your-prisma-endpoint"
schema_files_path = "/root/manisha/prisma/generated/prisma.graphql"
schema = load_schema_from_path(schema_files_path)
query = QueryType()
def make_call_to_prisma(info):
data = info.context["request"]._body
resp = requests.post(
url=prisma_url, headers={"content-type": "application/json"}, data=data
)
return resp
@query.field("users")
def resolve_users(_, info, where=None):
result = make_call_to_prisma(info)
print(result.json())
return result.json()["data"]["users"]
schema = make_executable_schema(schema, query)
app = GraphQL(schema, debug=True)
推荐阅读
- automation - 尝试使用 autohotkey 对本地 html 文件执行某些处理时出现“rpc 服务器不可用”
- javascript - React-Native & Redux “动作必须是普通对象。为异步函数使用自定义中间件”
- javascript - 下一个图像功能在调用时不显示
- node.js - ionic 3 中的 socket.io 客户端不工作?
- python - python f'string 在 pd.Series.map 函数中不起作用
- php - 无法在后端设计配置中更改 magento2 主题
- windows - Windows 命令行:在新的控制台窗口中执行 .bat 文件
- scala - 将以前的数据与 Spark Scala 中的当前数据进行比较
- powerbuilder - 如何在powerbuilder中禁用复制粘贴功能到单行编辑器
- rest - 将输入参数传递给 API