Prisma 数据导出实战指南:CLI 命令与原始 Export API 全解析(NDF 格式)
后端数据库GraphQL【免费下载链接】prisma1 Database Tools incl. ORM, Migrations and Admin UI (Postgres, MySQL MongoDB) [deprecated]项目地址https://gitcode.com/gh_mirrors/pr/prisma1点击查看免费下载Prisma 服务的数据导出既可以通过prisma export命令一键完成也可以直接调用服务端暴露的原始 Export API。两种方式产出的数据均为 JSON 格式并遵循 Prisma 的规范化数据格式Normalized Data Format简称 NDF因此导出的数据可以直接导入到 schema 完全一致的服务中例如在dev环境准备测试数据。读完本文你将掌握prisma export的完整用法、NDF 输出结构、原始/export接口的请求与游标cursor分页语义并从源码层面理解导出链路的实现原理。一、两种导出方式的总体对比Prisma 提供两条导出路径它们共享同一套底层导出逻辑维度CLI 导出原始 Export API命令/入口prisma exportPOST 到服务 HTTP 端点的/export路径认证复用 CLI 的认证机制自动携带 token必须在 HTTPAuthorization头中手动携带 JWT token文件落盘自动将下载数据写入文件系统并打包为.zip只返回 JSON 响应需自行处理存储游标管理自动循环请求直到数据取完每次响应返回新游标需要手动携带重发请求从源码实现看CLI 的prisma export底层正是封装了下一节介绍的原始 Export APICLI 通过 Client.download 方法向集群的 export 端点发起 POST 请求并自动处理分页与文件写盘源码见 commands/export/index.ts 与 commands/export/Exporter.ts。这解释了为什么使用 CLI 导出具三个明显优势复用认证机制无需手工发送 token、直接写入文件系统、自动进行游标管理手工方式需要多次发请求并每次调整游标。二、使用 CLI 导出数据命令与参数CLI 提供的导出命令为prisma export文档中记载该命令接受一个核心选项--export-path短写-e指定一个.zip文件路径CLI 会创建该文件并将导出的数据写入其中。需要说明的是当前仓库中的实现commands/export/index.ts已对参数做了演进实际定义的 flags 包括--path短写-p导出.zip文件的路径--env-file短写-e注入环境变量的.env文件路径--projectPrisma 定义文件prisma.yml的路径。此外源码还给出两个实用细节自动补全扩展名如果传入的路径不以.zip结尾CLI 会自动追加.zip如果完全未指定路径则默认生成名为export-ISO时间戳.zip的文件如export-2026-09-23T00:46:01.000Z.zip文档型数据库不支持如果数据模型定义中的databaseType为document即 MongoDBCLI 会直接抛出错误提示使用数据库原生的导出工具如mongodump。同时对关系型数据库的导出CLI 会打印一条警告prisma1 export命令未来将不再继续开发建议相关工作流使用数据库原生导出特性MySQL 的mysqldump、Postgres 的pg_dump等。导出后的提示导出完成后CLI 会打印导出文件路径并给出对应的导入命令提示Exported service to export-timestamp.zip You can import it to a new service with $ prisma import --data export-timestamp.zip这体现了导出与导入的闭环设计NDF 数据可以被prisma import直接回灌到 schema 一致的服务。CLI 导出在源码中的完整流程Exporter.ts 揭示了 CLI 导出的内部步骤在.export临时目录下创建nodes、lists、relations三个子目录makeDirs依次对nodes、lists、relations三种 NDF 类型执行分页下载downloadFiles每次分页响应成功后将响应中的jsonElements包装为{ valueType, values }结构写入编号 JSON 文件文件名带前导零如000001.json、000002.json以返回的新cursor作为下一次请求的游标继续循环直到游标之和小于 0即服务端返回终止游标为止全部下载完成后用archiver库将.export目录打包成目标.zip文件随后清理临时目录。也就是说即便数据量很大需要数十次请求CLI 也会自动持续拉取直至完整导出这正是文档强调的“cursor management”能力。三、输出格式NDF 与三个目录导出的数据遵循 Normalized Data FormatNDF解压.zip后会得到三个以 NDF 类型命名的目录nodes/模型节点数据即每个 model 的实例记录lists/标量列表字段scalar list数据relations/关系relation数据即模型之间的关联记录。CLI 的 Exporter.ts 中定义了三种文件类型export type FileType nodes | relations | lists服务端 ImportExport.scala 进一步说明这三类数据对应的“表”维度NodeInfo按 model 顺序编号table对应 model 下标逐行导出节点的所有标量字段ListInfo按“模型标量列表字段”组合编号table对应列表字段下标RelationInfo按 relation 顺序编号table对应 relation 下标。每个 JSON 文件中节点数据形如{ valueType: nodes, values: [ { _typeName: User, id: cjx8..., name: Alice } ] }其中_typeName指明所属模型id为记录主键其余键为标量字段值服务端序列化逻辑见 BulkExport.scala。四、使用原始 Export API 导出原始导出接口位于服务 HTTP 端点的/export路径下例如http://localhost:60000/my-app/dev/exporthttps://database.prisma.sh/my-app/prod/export接口要求方法POST请求头必须在Authorization头中携带认证 tokenBearer JWT请求体JSON包含fileType与cursor两个字段响应上限单次请求最多可下载约 10 MB 的 NDF JSON 数据该上限由服务端maxImportExportSize配置控制详见下文源码解析。一次导出的请求体示例如下{ fileType: nodes, cursor: { table: 0, row: 0, field: 0, array: 0 } }游标cursor的含义cursor中的四个值描述了数据库中开始导出的偏移位置table表偏移对应 model / 列表字段 / relation 的序号row行偏移对应当前表内已导出的记录数field字段偏移array数组偏移。服务端定义见 ImportExport.scala核心游标实际由table与row组成field与array为兼容保留字段源码注释也明确指出未来希望去掉这两个字段使 CLI 与其解耦。响应游标的两种状态每次导出响应都会返回一个新的cursor它只有两种状态终止状态导出完成若table、row、field、array全部为-1表示该fileType的数据已全部导出完毕非终止状态未导出完若四个值中任何一个不等于-1说明已达到单次响应的大小上限约 10 MB此时应将响应返回的cursor原样作为下一次请求的输入继续导出剩余数据。服务端在 ImportExport.scala 的cursorWrites中实现了这一序列化规则仅当table与row均为-1时field与array才写为-1否则写为0并在 BulkExport.scala 的resForCursor中当数据取完时返回Cursor(-1, -1)以标记终止。完整 curl 示例下面是导出 NDF 类型为nodes数据的完整curl命令示例中的 JWT 仅为演示占位curl http://localhost:60000/my-app/dev/export \ -H Content-Type: application/json \ -H Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJPbmxpbmUgSldUIEJ1aWxkZXIiLCJpYXQiOjE1MTM1OTQzMTEsImV4cCI6MTU0NTEzMDMxMSwiYXVkIjasd3d3LmV4YW1wbGUuY29tIiwic3ViIjoianJvY2tldEBleGFtcGxlLmNvbSIsIkdpdmVuTmFtZSI6IkpvaG5ueSIsIlN1cm5hbWUiOiJSb2NrZXQiLCJFbWFpbCI6Impyb2NrZXRAZXhhbXBsZS5jb20iLCJSb2xlIjpbIk1hbmFnZXIiLCJQcm9qZWN0IEFkbWluaXN0cmF0b3IiXX0.L7DwH7vIfTSmuwfxBI82D64DlgoLBLXOwR5iMjZ_7nI \ -d {fileType:nodes,cursor:{table:0,row:0,field:0,array:0}} \ -sSv通用的占位符版本如下便于你直接替换为实际值curl __SERVICE_ENDPOINT__/export \ -H Content-Type: application/json \ -H Authorization: Bearer __JWT_AUTH_TOKEN__ \ -d {fileType:__NDF_TYPE__,cursor: {table:__TABLE__,row:__ROW__,field:__FIELD__,array:__ARRAY__}} \ -sSv手动使用该接口时需要重复发送请求每次把响应返回的cursor填入下一次请求直至服务端返回全-1的终止游标。对于数据量较大的服务这一过程容易出错因此优先推荐使用 CLI。五、源码视角服务端导出链路的实现原理服务端导出逻辑集中在 BulkExport.scala其核心设计可以概括为三层分页按 fileType 分发executeExport根据fileType分别构造NodeInfo、ListInfo、RelationInfo。如果模型为空、无列表字段或无 relation则直接返回空的终止结果BulkExport.scala表内分页resultForTable通过DataResolver按每页 1000 条拉取数据first Some(1000)直到当前“表”取完BulkExport.scala表间推进resForCursor在当前表取完后通过cursorAtNextModel把table加一并把row归零切换到下一个 model / 列表字段 / relation全部取完后返回Cursor(-1, -1)作为终止标记BulkExport.scala。关于“10 MB 响应上限”服务端通过maxImportExportSize配置来控制单次响应的 JSON 体量isLimitReached会累计已序列化元素的字节数一旦超过上限即返回当前游标BulkExport.scala。该配置在 ApiDependencies.scala 中定义默认值为1000000单位字节实际单次响应的最大体量以你部署环境中的配置值为准。从关系型数据到 NDF 的序列化细节也值得留意BulkExport.scala节点输出{_typeName: 模型名, id: 主键, ...标量字段}主键会根据 GC 值类型输出为字符串UUID / 字符串 ID或数字整数 ID列表输出{_typeName: 模型名, id: 所属记录主键, 字段名: 列表值}关系输出包含左右两侧的数组每侧为{_typeName: 模型名, id: 对端主键, fieldName: 字段名}。六、导出数据的回灌与 Import 的闭环导出的 NDF 数据可以直接导入到 schema 一致的服务典型场景包括在dev环境准备测试数据。导入侧的对应实现为 commands/import/Importer.tsCLI 导入命令为prisma import --data 导出zip导入时会先解压 zip校验nodes、lists、relations三个目录是否存在并逐文件校验 NDF 结构validateFiles导入过程按nodes→lists→relations的顺序上传并通过state.json记录进度异常中断后可断点续传已导入的文件会被自动跳过上传同样走原始 APIClient.upload向集群的 import 端点 POST 数据见 Client.ts。由此可以推断导出与导入在格式上是对称的导出时Exporter写盘的结构{ valueType, values }与导入时Importer读取并上传的结构完全一致保证了两条链路之间的数据可无缝往返。七、使用注意事项与限制文档型数据库暂不支持databaseType为document时prisma export会直接报错需要改用数据库原生工具如mongodump功能演进状态CLI 会对关系型数据库的导出打印“该命令未来不再继续开发”的警告建议长期工作流评估数据库原生导出方案MySQL 与 Postgres 均已有成熟工具手动调用 API 需管理游标数据量大时单次请求无法取完必须循环携带新游标请求直至收到全-1的终止游标使用 CLI 可自动完成这一过程认证不可省略原始 API 要求请求头携带有效的Authorization: Bearer JWT否则请求会被拒绝schema 一致性前提NDF 数据只能在 schema 完全一致的服务之间迁移schema 不一致时导入可能失败。结语无论是通过prisma export一键打包还是通过原始/export接口精细控制分页Prisma 的数据导出都以统一的 NDF 格式交付并与导入链路天然打通。理解游标语义与服务端的分页实现能帮助你在大数据量导出、跨环境数据迁移和测试数据准备等场景中避免踩坑。相关源码可继续阅读CLI 导出命令cli/packages/prisma-cli-core/src/commands/export/index.tsCLI 导出器实现cli/packages/prisma-cli-core/src/commands/export/Exporter.ts服务端导出核心server/servers/api/src/main/scala/com/prisma/api/import_export/BulkExport.scala游标与请求/响应模型server/servers/api/src/main/scala/com/prisma/api/import_export/ImportExport.scalaCLI 导入对应实现cli/packages/prisma-cli-core/src/commands/import/Importer.ts赞分享后端数据库GraphQL【免费下载链接】prisma1 Database Tools incl. ORM, Migrations and Admin UI (Postgres, MySQL MongoDB) [deprecated]项目地址https://gitcode.com/gh_mirrors/pr/prisma1点击查看免费下载相关推荐Prisma 服务数据导入导出实战NDF 格式、prisma import/export 命令与原始 HTTP API 全解析Prisma 服务数据导入导出实战NDF 格式、prisma import/export 命令与原始 HTTP API 全解析 本篇技术指南以 Prisma后端数据库GraphQLPrisma 数据导出完全指南CLI 命令与原生 Export API 实战基于 NDF 格式Prisma 数据导出完全指南CLI 命令与原生 Export API 实战基于 NDF 格式 本指南系统讲解 Prisma 服务数据导出的两种官方途径—后端数据库GraphQLPrisma 数据导入与导出实战指南NDF 标准化格式、prisma import/export 命令与原始 HTTP APIPrisma 数据导入与导出实战指南NDF 标准化格式、prisma import/export 命令与原始 HTTP API 本指南以 Prismapri后端数据库GraphQL创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考