跳至内容

架构

此页面介绍了 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 文档中的此图表。

client diagram