ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Prisma 服务配置完全指南:从 `prisma.yml` 到数据模型部署(prisma1 仓库 1.3 参考文档)

Prisma 服务配置完全指南:从 `prisma.yml` 到数据模型部署(prisma1 仓库 1.3 参考文档) Prisma 服务配置完全指南从prisma.yml到数据模型部署prisma1 仓库 1.3 参考文档【免费下载链接】prisma1 Database Tools incl. ORM, Migrations and Admin UI (Postgres, MySQL MongoDB) [deprecated]项目地址: https://gitcode.com/gh_mirrors/pr/prisma1本文以仓库 docs/1.3/04-Reference/02-Service-Configuration/01-Overview.md 为骨架结合同目录下的prisma.yml配置详解、变量机制文档以及prisma-yml、prisma-cli-core的真实源码实现系统梳理 Prisma1.3 版本服务配置的完整链路CLI 的安装与初始化、prisma.yml的全部字段语义、变量替换机制、以及 deploy 命令的实战用法。读完本文你将能够独立编写、校验并部署一个完整的 Prisma 服务。一、Prisma 服务配置的整体脉络在 Prisma 的世界里Prisma CLI 是管理数据库服务的主要工具。一个 Prisma 服务的配置由两条线索交织而成CLI 命令负责初始化init、部署deploy、生成客户端generate、导入导出import/export等生命周期操作服务定义文件prisma.yml集中描述服务的名称、数据模型、部署目标、认证方式、事件订阅、种子数据等一切配置。二者通过一条中心工作流衔接部署deploy一个数据模型data model。数据模型用 SDLSchema Definition Language编写部署后 Prisma 会将其转化为一个完整的 GraphQL CRUD API。在 1.3 参考文档中这一配置体系被组织为三个文件文档内容Overview本文总览CLI 与prisma.yml的关系、快速上手prisma.yml 概览与示例完整的prisma.yml示例与字段说明YAML 结构每个根属性的类型、约束与示例使用变量环境变量、自引用、CLI 选项三种变量来源关于数据模型本身SDL 语法、类型、关系、枚举等请参阅同节的 数据建模SDL.md)。二、快速上手安装 CLI 并初始化服务2.1 从 npm 安装Prisma CLI 通过 npm 全局安装npm install -g prisma安装完成后prisma命令即成为管理数据库服务的入口。2.2 初始化一个新服务使用init命令初始化服务随后跟随交互式提示基于所选模板引导生成服务骨架prisma init从源码看init命令位于 cli/packages/prisma-cli-core/src/commands/init/init.ts它会根据所选数据库类型写入对应的数据模型模板boilerplate选择 MongoDB 时复制boilerplate/datamodel-mongo.prisma其他数据库如 MySQL/PostgreSQL时复制boilerplate/datamodel.prisma同时会生成docker-compose.yml本地开发环境所需。内置的最小数据模型模板boilerplate/datamodel.prisma长这样type User { id: ID! id name: String! }初始化后你的项目目录将包含prisma.yml服务定义和至少一个数据模型文件接下来即可在prisma.yml中完善配置。三、服务定义文件prisma.yml详解3.1 一个完整的示例下面这份示例源自 prisma.yml 概览与示例展示了prisma.yml的所有常用字段是理解本节的基准# REQUIRED # my-demo-app 是本 Prisma 服务的名称 service: my-demo-app # REQUIRED # 本服务基于 database/types.graphql 与 database/enums.graphql # 两个文件中的类型定义 datamodel: - database/types.graphql - database/enums.graphql # OPTIONAL # 服务将部署到 local 集群。 # 注意如果省略该字段CLI 会交互式询问部署目标 # 并把你的选择持久化回此处。 cluster: local # REQUIRED # 本服务将部署到 dev stage stage: dev # OPTIONAL (default: false) # 服务是否需要认证取决于 PRISMA_DISABLE_AUTH 环境变量的值 disableAuth: ${env:PRISMA_DISABLE_AUTH} # OPTIONAL # 若 Prisma 服务需要认证此字段用于生成 JWT token secret: # OPTIONAL # 部署完成后完整 GraphQL schema 的写入路径。 # 注意该 schema 是基于数据模型自动生成的。 schema: schemas/prisma.graphql # OPTIONAL # 本服务配置了一个事件订阅。对应的订阅查询位于 # database/subscriptions/welcomeEmail.graphql。 # 当订阅被触发时通过 HTTP 调用指定的 webhook。 subscriptions: sendWelcomeEmail: query: database/subscriptions/sendWelcomeEmail.graphql webhook: url: https://${self:custom.serverlessEndpoint}/sendWelcomeEmail headers: Authorization: ${env:MY_ENDPOINT_SECRET} # OPTIONAL # 指向一个包含 GraphQL 操作的 .graphql 文件 # 该文件中的操作会在服务首次部署时执行。 seed: import: database/seed.graphql # OPTIONAL # 自定义变量可在 subscription 的 webhook 中引用 custom: serverlessEndpoint: https://bcdeaxokbj.execute-api.eu-west-1.amazonaws.com/dev该服务定义对应的预期文件结构. ├── prisma.yml ├── database │ ├── subscriptions │ │ └── welcomeEmail.graphql │ ├── types.graphql │ └── enums.graphql └── schemas └── prisma.graphql3.2 根属性总览prisma.yml的根属性详见 YAML 结构属性必填类型作用service✅string服务名称会反映到部署后的 endpoint 中datamodel✅string / string[]数据库模型、关系、枚举等类型定义stage✅string要部署到的 stage 名称cluster可选string部署目标集群省略时交互式选择disableAuth可选boolean是否禁用 endpoint 的认证secret可选string用于保护 API endpoint 的密钥schema可选stringPrisma 数据库 schema 的写入路径subscriptions可选object事件订阅函数配置seed可选object数据种子指令custom可选object自定义变量供其他字段引用下面逐一展开各字段的约束与用法。3.3service服务名称service定义了服务名它会反映到部署后的 endpoint中。命名约束只能包含字母数字、连字符-和下划线_必须以大写或小写字母开头长度不超过 64 个字符。service: hello-worldservice: My-DEMO_APP1233.4datamodel数据模型datamodel指向一个或多个包含 SDL 类型定义的.graphql文件。若提供多个文件CLI 会在部署时将文件内容直接拼接。datamodel: types.graphqldatamodel: - types.graphql - enums.graphql源码佐证在 PrismaDefinition.ts 的getTypesString方法中CLI 将datamodel无论单值还是数组归一化为数组逐一读取文件并拼接到一个字符串中const typesPaths definition.datamodel ? Array.isArray(definition.datamodel) ? definition.datamodel : [definition.datamodel] : [] // 读取每个文件并拼接allTypes types \n若文件不存在CLI 会直接抛出错误The types definition file ... could not be found.从而在部署前尽早发现路径问题。3.5stage部署阶段stage定义部署目标stage的名称stage: dev也可以直接从环境变量读取stage: ${env:MY_STAGE}3.6cluster部署集群cluster指向全局注册表~/.prismarc中的集群如local。命名约束与service相同字母数字、连字符、下划线以字母开头最多 64 字符。cluster: local若省略clusterprisma deploy会进入交互式集群选择并把选择结果写回prisma.yml。从源码看当目标集群为共享集群shared且不是私有集群时validate()还会校验cluster属性必须包含 workspace slug形如workspace/cluster-name否则抛出明确错误提示见 PrismaDefinition.ts。3.7disableAuth与secret认证控制disableAuth控制服务是否需要认证disableAuth: true # 任何人拥有数据库的完整读写权限 disableAuth: false # 启用认证默认值警告disableAuth: true意味着任何人都能对数据库进行完全读写仅在无需保护的环境中才应如此设置。secret用于生成签名认证令牌JWT。若服务需要认证客户端必须在 HTTP 请求的Authorization头中携带令牌。secret的约束必须是 UTF-8 编码不能包含空格长度不超过 256 个字符可以在一个字符串中编码多个密钥逗号分隔空格会被忽略从而实现平滑的密钥轮换。secret: moo4ahn3ahb4phein1eingaep# 三个密钥第二个密钥前的空格会被忽略 secret: myFirstSecret, SECRET_NUMBER_2,3rd-secretsecret: ${env:MY_SECRET}源码佐证在 PrismaDefinition.ts 中secrets的解析正是“去掉所有空白字符后按逗号切分”const secrets this.definition.secret this.secrets secrets ? secrets.replace(/\s/g, ).split(,) : null而getToken方法PrismaDefinition.ts使用第一个密钥为servicestage签发有效期为 7 天、角色为admin的 JWTreturn jwt.sign(data, this.secrets[0], { expiresIn: 7d })关于认证细节可进一步参阅 Prisma API 概念 中的 authentication 部分。3.8schema数据库 schema 输出路径每次部署服务时CLI 会根据数据模型生成服务的数据库 schema通常命名为database.graphql其中包含数据模型里所有类型的 CRUD 操作定义。schema属性指定该生成文件的存储路径。若未设置schemaCLI 将不会生成和存储数据库 schema。注意若项目中使用graphql-config且.graphqlconfig文件设置了schemaPath属性则schemaPath优先级更高会覆盖prisma.yml中的schema。schema: database.graphqlschema: src/schemas/database.graphql3.9subscriptions事件订阅函数subscriptions定义服务的全部事件订阅函数每个订阅至少需要两到三部分信息订阅查询subscription query定义在什么事件发生时调用函数、以及负载payload的形状webhook URL事件发生时通过 HTTP 调用的地址可选HTTP 头随请求发送到该 URL 的请求头。subscriptions是对象类型其子属性为query必填订阅查询的文件路径和webhook必填URL 与可选 headers无 headers 时可直接把 URL 字符串赋给webhook。无 headers 的写法subscriptions: sendWelcomeEmail: query: database/subscriptions/sendWelcomeEmail.graphql webhook: https://bcdeaxokbj.execute-api.eu-west-1.amazonaws.com/dev/sendWelcomeEmail带两个 HTTP 头的写法subscriptions: sendWelcomeEmail: query: database/subscriptions/sendWelcomeEmail.graphql webhook: url: https://bcdeaxokbj.execute-api.eu-west-1.amazonaws.com/dev/sendWelcomeEmail headers: Authorization: ${env:MY_ENDPOINT_SECRET} Content-Type: application/json源码佐证getSubscriptions方法PrismaDefinition.ts会区分webhook是纯字符串还是{url, headers}对象字符串直接作为 URL对象则把 headers 转换为{name, value}列表同时验证.graphql订阅查询文件存在否则抛出错误。3.10seed数据种子数据种子seeding是一种向服务填充测试数据的标准化方式。seed是对象类型支持两种子属性import导入数据。可指向两类文件一个包含 GraphQL 操作的.graphql文件一个包含 NDFNormalized Data Format数据集的.zip文件run执行 shell 命令用于更复杂的种子场景当前版本尚未支持。seed: import: database/seed.graphqlseed: import: database/backup.zipseed: run: node script.js # 注意当前版本不支持 run种子数据会在服务首次部署时隐式执行除非用--no-seed标志显式禁用。对应的 CLI 实现位于 commands/seed/seed.ts 与 commands/seed/Seeder.ts。3.11custom自定义变量custom允许你定义任意希望在prisma.yml其他位置复用的值。它没有预定义结构通过self变量来源引用例如${self:custom.myVariable}。custom: serverlessEndpoint: https://bcdeaxokbj.execute-api.eu-west-1.amazonaws.com/dev subscriptionQueries: database/subscriptions/ subscriptions: sendWelcomeEmail: query: ${self:custom.subscriptionQueries}/sendWelcomeEmail.graphql webhook: https://${self:custom.serverlessEndpoint}/sendWelcomeEmail四、变量机制让配置动态化prisma.yml中的变量允许动态替换配置值。引用语法为${}括号括号内先写变量来源variable source和变量名以冒号分隔yamlKeyXYZ: ${src:myVariable} # 变量来源见下文 # 第二个参数提供默认值引号必须保留 otherYamlKey: ${src:myVariable, someDefaultValue}注意变量只能用于属性的值不能用于属性键。变量来源共有三种环境变量、自引用、CLI 选项。4.1 环境变量env:语法为env:前缀 环境变量名service: example stage: ${env:PRISMA_STAGE} cluster: ${env:PRISMA_CLUSTER} secret: ${env:PRISMA_SECRET} datamodel: database/datamodel.graphqlCLI 从 3 个位置、按以下顺序加载环境变量本地环境local environment--dotenv参数指定的文件若未提供--dotenv参数则读取同目录下的.env文件。源码佐证在 Variables.ts 的getValueFromEnv中变量名取自env:之后的片段并直接从envVars默认为process.env取值PrismaDefinition.ts 中则通过dotenv.config({ path: envPath })加载 dotenv 文件。4.2 自引用self:可以递归引用同一prisma.yml文件内的其他属性值。语法为self:前缀 可选的指向属性的路径若不指定路径变量值就是整个 YAML 文件。例如让createCRMEntry复用sendWelcomeEmail的订阅查询subscriptions: sendWelcomeEmail: query: database/subscriptions/createUserSubscription.graphql webhook: url: ${self:custom.serverlessEndpoint}/sendWelcomeEmail headers: ${self:custom.headers} createCRMEntry: query: ${self:functions.subscriptions.sendWelcomeEmail.query} webhook: url: ${self:custom.serverlessEndpoint}/createCRMEntry headers: ${self:custom.headers} custom: serverlessEndpoint: https://bcdeaxokbj.execute-api.eu-west-1.amazonaws.com/dev headers: Authorization: Bearer wohngaeveishuomeiphohph1ls源码佐证getValueFromSelf按点号路径在已解析的 JSON 中逐级取值若取到的值本身仍含变量语法还会递归继续解析Variables.ts。这也解释了“默认值”写法${src:myVariable, someDefaultValue}的实现逗号触发overwrite逻辑按顺序取第一个非空来源的值。4.3 CLI 选项opt:可以引用调用prisma命令时传入的 CLI 选项。语法为opt:前缀 选项名service: example stage: ${opt:stage} secret: secret123 datamodel: datamodel.graphql然后在执行部署时通过--stage传入prisma deploy --stage devCLI 会拾取该值将其作为prisma.yml中的stage使用Variables.ts 的getValueFromOptions即从命令参数对象中取值。五、部署工作流与常用 CLI 标志配置完成的落地动作是prisma deploy。其实现位于 commands/deploy/deploy.ts官方描述为 Deploy service changes (or new service)。常用标志标志说明--force, -f接受 schema 变更可能造成的数据丢失--new, -n强制交互式模式以选择集群--dry-run, -d对部署进行干跑不实际执行--no-seed首次部署服务时禁用种子数据--json, -j以 JSON 格式输出--no-migrate禁用迁移需 Prisma 1.26--env-file, -e注入环境变量的.env文件路径--project, -pPrisma 定义文件的路径--no-generate禁用隐式的客户端生成--skip-hooks部署时禁用 hooks部署时的核心流程包括加载并校验prisma.yml→ 解析 endpoint服务名、stage、集群、workspace→ 提交数据模型 → 生成数据库 schema若配置了schema→ 首次部署时执行种子数据除非--no-seed→ 生成客户端除非--no-generate。其中“找不到prisma.yml”时会抛出错误Couldn’t find \prisma.yml file. Are you in the right directory?PrismaDefinition.ts这也提醒我们在正确的目录中执行命令。六、编辑器集成编写prisma.yml时的自动补全与校验在编写prisma.yml时可以通过 JSON Schema 获得自动补全autocompletion与部署前的静态错误检查。目前该 Schema 体验仅对 VSCode 可用第 1 步安装 VSCode 的 Red Hatvscode-yaml插件。第 2 步在用户或工作区设置中加入如下配置yaml.schemas: { http://json.schemastore.org/prisma: prisma.yml }第 3 步在prisma.yml文件中用常用快捷键默认为Ctrl Space触发智能提示。此时会显示所有可用字段及其描述若出现任何错误VSCode 会即时标出。与 JSON Schema 对应的精确结构定义可参考仓库 cli/packages/prisma-yml 中PrismaDefinition的实际解析实现PrismaDefinition.ts二者共同保证了“编辑器提示”与“CLI 运行时解析”的行为一致。七、小结围绕 服务配置总览 所勾勒的主线本文完整覆盖了CLI 生命周期npm install -g prisma安装、prisma init初始化以及内置的数据模型模板prisma.yml全字段语义service、datamodel、stage、cluster、disableAuth、secret、schema、subscriptions、seed、custom的类型、约束与示例变量机制env:、self:、opt:三种来源及其递归解析的底层实现部署实践prisma deploy的常用标志与执行流程开发体验基于 JSON Schema 的 VSCode 自动补全与校验。配置只是起点。下一步可以深入阅读 数据建模SDL.md) 以掌握数据模型语法或参考 CLI 命令参考 了解generate、import、export、reset等更多命令将服务配置扩展为完整的开发与运维闭环。【免费下载链接】prisma1 Database Tools incl. ORM, Migrations and Admin UI (Postgres, MySQL MongoDB) [deprecated]项目地址: https://gitcode.com/gh_mirrors/pr/prisma1创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表