架构
此页面介绍了 Prisma Client Python 核心功能的内部工作原理。它旨在帮助理解代码,并希望能够让更多人参与贡献。
注意
此页面假设您至少具备 Python 的基本工作知识。
设计原则
-
类型安全
每个 Python API 操作 *必须* 具有准确的类型定义。
概述
Prisma Client Python 由两个核心组件组成,客户端生成 和 客户端 API。
生成
解析模式文件和调用生成器由 Prisma 内部处理。
在幕后,提供者值只是一个指向 shell 脚本的指针,例如,以下生成器在功能上都是等效的。
generator client {
provider = "prisma-client-py"
}
generator client {
provider = "python3 -m prisma"
}
generator client {
provider = "python3 -c 'from prisma.cli import main; main()'"
}
它是如何工作的?
Prisma 使用 JSON-RPC 将数据发送到生成器,我们的实现可以在 src/prisma/generator/jsonrpc.py
中找到,与 Prisma 的通信在 src/prisma/generator/generator.py
中的 BaseGenerator.invoke()
函数中实现。
控制流程
prisma generate
- Prisma 启动生成器进程
- 生成器进程等待来自 prisma 的消息
- Prisma 发送
getManifest
获取生成器元数据 - 生成器响应并等待新消息
- Prisma 发送
generate
- 生成器将 python 文件写入磁盘并发送空响应
- Prisma 关闭生成器进程
当发送 generate
消息时,prisma 会包含一个 DMMF,它是 Prisma Schema AST,它以 JSON 形式表示 Prisma Schema 文件。
然后我们将 DMMF 解析为 pydantic 模型,这确保我们的代码期望与 prisma 提供的相同 DMMF 结构。DMMF 模型可以在 src/prisma/generator/models.py
中找到。
然后我们使用 Jinja2 渲染 python 文件,然后将它们写入输出位置。
客户端 API
简而言之,客户端 API 是 Prisma 查询引擎公开的 GraphQL API 的包装器。
它是如何工作的?
连接
当调用 Client.connect()
时,将执行以下步骤
- 查找查询引擎二进制文件
- 启动查询引擎进程
- 向 HTTP API 发送健康检查,直到服务器准备就绪
执行查询
查询通过向查询引擎服务器发送 GraphQL 请求来执行,查询由渲染的 builder.py
文件构建,该文件对应于 src/prisma/generator/templates/builder.py.jinja
模板。
查询看起来像这样
query {
result: findUniqueUser
(
where: {
id: "ckq23ky3003510r8zll5m2hma"
}
)
{
id
name
profile {
id
user_id
bio
}
}
}
数据库操作由 Prisma 的查询引擎二进制文件处理,请参阅 prisma 文档中的此图表。