
后端数据库GraphQL【免费下载链接】prisma1 Database Tools incl. ORM, Migrations and Admin UI (Postgres, MySQL MongoDB) [deprecated]项目地址https://gitcode.com/gh_mirrors/pr/prisma1点击查看免费下载本教程以 Prisma CLI 为核心完整演示数据导出prisma export与导入prisma import的端到端流程从初始化服务、通过 seed 填充初始数据到以 Normalized Data FormatNDF导出数据、部署到新的 Stage再将该数据导入新服务。读完本文你将掌握 NDF 的三种数据类型结构与 Zip 包目录布局、prisma.yml中 seed 与 stage 的配置方式以及导出/导入命令的完整参数与底层实现原理。导出与导入的中间格式Normalized Data FormatNDFPrisma 在导入和导出数据时使用一种专用的中间格式——Normalized Data FormatNDF。数据不直接从 SQL / MongoDB 迁移到另一个 Prisma 服务而是先被“规范化”为 NDF再以分块上传的方式写入目标服务。整个过程可以用下图概括-------------- ---------------- ------------ | -------------- | | | | | | | | | | | | | | SQL | | (1) transform | NDF | (2) chunked upload | prisma | | | MongoDB | | -------------- | | ------------------- | | | | JSON | | | | | | | | | | | | | | -------------- | ---------------- ------------ --------------NDF 将数据按三种 value type 拆分存放Nodes节点标量字段、Lists节点的列表字段、Relations通过关系字段连接两个节点。关于每种类型的具体 JSON 结构可参考 NDF 参考文档。本教程将完成以下步骤创建一个 Prisma 服务为服务填充初始数据seeding以 NDF 格式导出数据将服务部署到新的 Stage以 NDF 格式导入数据第一步创建 Prisma 服务在终端中进入任意目录运行以下命令初始化一个名为import-example的服务prisma init import-example当 CLI 提示选择模板时选择Minimal setup: database-only最小化配置仅数据库。该命令会创建名为import-example的新目录其中包含根配置文件prisma.yml以及服务数据模型定义文件datamodel.graphql。更新数据模型加入关系字段接下来更新数据模型以加入一个关系relation。打开datamodel.graphql将内容改为type User { id: ID! unique name: String! posts: [Post!]! } type Post { id: ID! unique title: String! author: User! }这里User与Post构成一对多关系一个User拥有多个Postposts字段每个Post通过author字段指向其作者。之所以引入关系是为了在后面演示 NDF 中relations类型的导出与导入——它专门负责在导入时重建节点之间的关系。第二步填充初始数据Seeding在import-example目录下创建seed.graphql文件加入下面的 mutationmutation { createUser(data: { name: Sarah, posts: { create: [ { title: GraphQL is awesome }, { title: It really is }, { title: How to GraphQL is the best GraphQL tutorial } ] } }) { id } }该 mutation 一次性创建名为 Sarah 的用户及其三篇博文形成一棵嵌套的创建操作。在 prisma.yml 中声明 seed 文件为了让 CLI 感知到这个文件需要在prisma.yml中设置seed属性。打开prisma.yml并更新为service: import-example stage: dev datamodel: datamodel.graphql # to enable auth, provide # secret: my-secret disableAuth: true seed: import: seed.graphql这里的关键配置是seed.import它指向种子数据文件。从源码看seed.import支持两种文件.graphqlmutation 查询和.zipNDF 数据包对应的实现位于 Seeder.ts.graphql文件会被解析为多个 GraphQL operation 逐个执行.zip文件则会走Importer的分块导入流程此外seed.run还可用于指定一条自定义 shell 命令来执行种子逻辑与seed.import二选一。部署服务时CLI 会把seed.graphql中定义的 mutation 发送到服务的 API 执行。部署并验证种子数据运行部署命令prisma deploy当 CLI 提示部署到哪个cluster时选择公共集群选项之一prisma-eu1或prisma-us1。注意使用 Docker 部署时 seeding 同样生效。CLI 会部署服务并执行seed.graphql中的 mutation。为了确认 seeding 确实生效可以打开 GraphQL Playground 发送如下查询{ users { name posts { title } } }Prisma API 将返回{ data: { users: [ { name: Sarah, posts: [ { title: GraphQL is awesome }, { title: It really is }, { title: How to GraphQL is the best GraphQL tutorial } ] } ] } }第三步以 NDF 格式导出数据现在把devStage 中的数据导出为 NDF。在import-example目录下执行prisma export执行后会生成名为export-__TIMESTAMP__.zip的文件其中__TIMESTAMP__是导出时刻的精确时间戳。zip 包内的文件即为 NDF 格式。导出流程的源码实现导出并非一次性拉取全部数据而是按类型分块下载后压缩成 zip。在 Exporter.ts 中可以看到完整的download流程在项目根目录的.export/下创建nodes/、lists/、relations/三个子目录见makeDirs依次下载三类数据文件downloadFiles(nodes...)→downloadFiles(lists...)→downloadFiles(relations...)调用zipIt()用archiver将目录压缩为 zip压缩完成后删除临时的.export/目录。其中downloadFiles使用游标cursor分页拉取数据游标由table / row / field / array四维坐标组成每一页数据被写入一个000001.json、000002.json……这样的顺序编号文件中文件内容形如{ valueType: nodes, values: [...] }仓库中 export/download 目录下的nodes/000001.json、relations/000001.json、lists/000001.json即真实导出产物示例可对照查看 NDF 在磁盘上的实际形态。export 命令的参数prisma export还支持以下可选 flag定义见 export/index.tsFlag缩写说明--path-p指定导出 zip 文件的路径缺省时自动生成export-ISO时间戳.zip且会自动补全.zip后缀--env-file-e指定注入环境变量的.env文件路径--project-p指定 Prisma 定义文件prisma.yml的路径需要特别注意的是如果服务的数据库类型为文档型MongoDBdatabaseType: documentCLI 会直接报错提示Export 暂不支持文档型存储并建议使用 MongoDB 原生的mongodump等导出工具对 SQL 类数据库MySQL、Postgres则仅打印一条警告提示prisma export命令未来将不再继续开发建议 SQL 类工作流使用数据库原生导出工具如mysqldump、pg_dump系列。第四步将服务部署到新的 Stage接下来通过部署到新 Stage 的方式创建一个服务的“克隆”。打开prisma.yml将stage属性改为新值并移除seed和cluster属性service: import-example stage: test datamodel: datamodel.graphql # to enable auth, provide # secret: my-secret disableAuth: true再次运行prisma deploy将服务部署到新的testStage。和之前一样当被询问部署位置时选择prisma-eu1或prisma-us1。此时testStage 上的服务与dev拥有完全相同的数据模型datamodel.graphql但没有任何业务数据——这正是接下来要导入的目标。第五步以 NDF 格式导入数据服务运行起来后就可以把之前导出的 zip 数据导入进去了。运行下面的命令注意将__DATA__占位符替换为导出 zip 的实际路径例如export-2018-01-13T19:28:25.921Z.zipprisma import --data __DATA__--data缩写-d是必选参数接受 zip 文件路径或一个已解压的目录路径源码见 import/index.ts。CLI 会先校验路径存在、且为.zip结尾或目录否则报错。导入完成后打开当前testStage 的 GraphQL Playground再次发送之前的users查询即可看到 Sarah 及其三篇博文被完整还原——证明导入成功。导入流程的源码实现prisma import的底层由 Importer.ts 驱动其流程为解压若传入的是 zip用adm-zip解压到临时目录.import/校验调用Validator对每个 JSON 文件中的数据进行合法性校验分类型上传按nodes→lists→relations的顺序把每个编号 JSON 文件逐个上传到目标服务断点续传每上传完一个文件就把进度写入state.json记录nodes/lists/relations三个计数器下次导入时通过getState()跳过已导入的文件Skipping file xxx (already imported)清理全部上传完成后删除临时.import/目录若中途出现异常也会进行清理。仓库中的 import/fixtures/basic/import 目录保存了测试用的完整 NDF 数据包含nodes/、lists/、relations/三个子目录及state.json、import.zip是观察导入输入格式最直观的样例。NDF 三种数据类型详解无论是手工构造导入数据还是阅读导出结果都需要理解 NDF 的三种 value type 结构。下面结合 NDF 参考文档 与 types.ts 中的类型定义说明。Nodes节点标量数据values数组中的每个对象代表一个节点必须包含_typeName对应数据模型中的 SDL 类型名与id字符串其余为标量字段{ valueType: nodes, values: [ {_typeName: User, id: johndoe, firstName: John, lastName: Doe}, {_typeName: User, id: sarahdoe, firstName: Sarah, lastName: Doe} ] }Lists列表字段数据每个对象同样包含_typeName与id但只携带一个标量列表字段的值{ valueType: lists, values: [ {_typeName: User, id: johndoe, hobbies: [Fishing, Cooking]}, {_typeName: User, id: sarahdoe, hobbies: [Biking, Coding]} ] }Relations关系数据与 nodes/lists 不同values中每个元素是恰好包含两个节点的数组每个节点由_typeName、id和fieldName该端的关系字段名组成用于把两个节点通过指定关系字段连接起来{ valueType: relations, values: [ [ { _typeName: User, id: johndoe, fieldName: partner }, { _typeName: User, id: sarahdoe, fieldName: partner } ] ] }导入数据的校验规则导入前 CLI 会使用 Validator.ts 对每一份 NDF 数据做严格校验校验依据来自当前服务的datamodel.graphql解析结果见Validator构造函数中对typesString的 GraphQL AST 解析主要包括每个对象必须有_typeName且该类型必须存在于数据模型中checkTypeName每个对象必须有字符串类型的idcheckIdField数据模型中必填的非关系标量字段必须出现checkRequiredFields未知字段会被拒绝checkUnknownFields标量值必须通过对应类型的校验器validatorsID/String必须是字符串Int必须是整数Float必须是数字DateTime必须匹配 ISO 8601 格式正则Boolean必须是布尔值Json必须是对象枚举类型则会校验取值是否在数据模型声明的枚举值集合内relations类型的每个 tuple 必须是二元数组两个节点都必须带fieldName且该字段必须真实存在于对应类型中validateRelationTuple。这些校验保证了进入目标服务的数据与目标数据模型严格一致这也是 NDF 能在不同 Stage、不同集群间安全迁移数据的前提。总结与注意事项通过本教程你已经走通了 Prisma 数据迁移的完整闭环初始化服务 → seed 填充 → NDF 导出 → 部署新 Stage → NDF 导入。整个过程都以prisma.yml与datamodel.graphql为锚点配合prisma export/prisma import两个命令完成数据在导出时被规范化为 NDF 的 nodes / lists / relations 三部分并以 zip 形式落盘导入时再按类型分块上传并重建关系。几个需要留意的限制文档型存储MongoDB暂不支持prisma export/prisma importCLI 会明确报错并建议使用 MongoDB 原生工具该命令面向的是本仓库对应的 Prisma 1.xprisma1时代的数据工作流源码中已附带警告prisma export与prisma import命令未来将不再继续开发SQL 类数据库的大规模迁移场景建议改用 MySQL / Postgres 的原生导入导出工具若导入中途失败.import/目录zip 解压产生的临时目录会在异常路径下被清理但已上传文件的进度已记录在state.json中重试时可跳过已完成文件继续导入。赞分享后端数据库GraphQL【免费下载链接】prisma1 Database Tools incl. ORM, Migrations and Admin UI (Postgres, MySQL MongoDB) [deprecated]项目地址https://gitcode.com/gh_mirrors/pr/prisma1点击查看免费下载相关推荐Prisma 数据导出与导入实战使用 NDF 格式在服务与 stage 之间迁移数据Prisma 数据导出与导入实战使用 NDF 格式在服务与 stage 之间迁移数据 本教程基于 Prisma 开源仓库 prisma1 讲解数据导出与导后端数据库GraphQLPrisma 数据导出与导入实战基于 NDF 格式跨 Stage 迁移与备份数据Prisma 数据导出与导入实战基于 NDF 格式跨 Stage 迁移与备份数据 本文以 Prisma 1.x 的「Data Export Import」后端数据库GraphQLPrisma 数据导入导出实战基于 NDF 格式完成服务备份、迁移与跨 Stage 数据复制Prisma 数据导入导出实战基于 NDF 格式完成服务备份、迁移与跨 Stage 数据复制 本指南以 Prisma本仓库对应 prisma1 时代的 CL后端数据库GraphQL上一篇react-native-ui-kitten主题变量继承构建主题层次结构下一篇N_m3u8DL-RE 流媒体下载完整指南HLS/DASH/MSS 解析、加密解密与直播录制创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考