- 后端
- 数据库
- GraphQL
【免费下载链接】prisma1
💾 Database Tools incl. ORM, Migrations and Admin UI (Postgres, MySQL & MongoDB) [deprecated]
本文以 Prisma 1.2 版本文档中的 Technical FAQ 为核心骨架,系统解答开发者最常问的五大技术问题:Prisma 能否自托管、如何接入已有数据库、支持哪些数据库、GraphQL 带来哪些收益,以及数据备份如何落地。同时结合本仓库(prisma1)的 CLI 源码、数据库连接器实现与数据导入导出参考文档,给出可验证的底层依据与实操指引。读完本文,你将掌握 Prisma 服务自托管与数据库接入的完整路径,并理解其数据导入导出(NDF)机制的细节。
一、Prisma 可以自己托管吗?
答案是肯定的。Prisma 官方 FAQ 明确指出,托管 Prisma 基本有两种方式:
- 自行托管(DIY):使用任意主流云服务商(如 Digital Ocean、AWS、Google Cloud 等)自行部署;
- 使用 Prisma Cloud(FAQ 撰写时为"coming soon"状态)。
从当前仓库的源码结构来看,Prisma 服务端是一个可独立部署的进程,仓库中提供了完整的本地化部署配套资源:
- server/docker-compose 目录下为各数据库准备了开箱即用的 Docker Compose 编排文件,覆盖
mysql、postgres、mongo、sqlite四种后端(如 mysql docker-compose 配置); - server/images 目录包含
prisma-local、prisma-prod、prisma-image-shared三类镜像相关代码,说明 Prisma 服务端既可以跑在本地开发环境,也可以打包为生产镜像部署到任意云主机。
这种"服务与数据库解耦"的架构意味着:Prisma 始终作为数据库之上的一层 API 网关运行,数据库本身仍由你完全掌控(这一点在后续"备份"章节会再次强调)。
二、如何将数据库连接到 Prisma?
FAQ 给出的接入路径分为三个明确步骤(以 MySQL 为例):
- 把 SQL schema 翻译成 GraphQL 数据模型(SDL):用 SDL(Schema Definition Language) 描述你的数据模型;
- 以该数据模型部署一个 Prisma service;
- 如果数据库此前已有数据,将数据导入 Prisma service(参考 Data Import 文档)。
从本仓库来看,第 1、2 步对应的核心配置载体是prisma.yml与datamodel.graphql(参见 Data Import 文档中的示例结构),而第 3 步的导入机制在仓库中有完整实现与文档支撑,值得展开说明。
2.1 导入数据:CLI 方式
Prisma CLI 提供prisma import命令,它接受一个选项:
--data(短写-d):指向包含待导入数据的目录(可以是普通目录或 zip 压缩目录)。
CLI 方式的优势在于:可一次上传多个文件、自动复用 CLI 的认证机制(无需手动附带 token)、支持暂停与恢复导入。其实现位于 cli/packages/prisma-cli-core/src/commands/import/index.ts。
2.2 导入数据:原始 Import API
原始导入 API 暴露在服务 HTTP 端点的/import路径下,例如:
http://localhost:60000/my-app/dev/importhttps://database.prisma.sh/my-app/prod/import
单次请求最多上传 10 MB 的 JSON 数据(NDF 格式),且必须在 HTTPAuthorization头中携带认证 token。一个通用化的curl请求模板如下:
curl '__SERVICE_ENDPOINT__/import' \ -H 'Content-Type: application/json' \ -H 'Authorization: Bearer __JWT_AUTH_TOKEN__' \ -d '{"valueType":"__NDF_TYPE__","values": __DATA__ }' \ -sSv2.3 两个必须知道的约束
Data Import 文档 对导入行为给出了两条重要警告:
- 导入不具备幂等性:每次导入都会新增数据,绝不会更新已有节点。同一个
id被重复导入会导致未定义行为甚至破坏服务; - API 不做数据校验:原始 import API 不校验数据合法性;只有使用 CLI 导入时才会执行基础校验。服务维护者有责任保证导入数据的有效性——一个实用技巧是:先导出一个相同数据模型服务的 export 数据作为格式参考。
三、Prisma 支持哪些数据库?
FAQ 撰写时(1.2 版本文档)明确说明:MySQL 是 Prisma 支持的首个数据库。而本仓库的 prisma-cli-core README 提供了更完整的规划信息:MySQL 开箱即用,更多数据库连接器随后推出,包括 PostgreSQL、MS SQL、MongoDB、Oracle、ArangoDB、Neo4j、DynamoDB、Elastic Search、Redis、CockroachDB、Cassandra 等。
从当前仓库的源码结构看,连接器生态已经远超"仅 MySQL"的阶段:
- server/connectors/api-connector-mysql 与 server/connectors/deploy-connector-mysql 提供 MySQL 支持;
- server/connectors/api-connector-postgres 与 server/connectors/deploy-connector-postgres 提供 PostgreSQL 支持;
- server/connectors/api-connector-mongo 与 server/connectors/deploy-connector-mongo 提供 MongoDB 支持;
- 此外还存在通用 JDBC 连接器(api-connector-jdbc、deploy-connector-jdbc)以及 SQLite 连接器。
也就是说,FAQ 中"目前仅支持 MySQL"的表述对应的是 1.2 版本时期的状态;当前仓库已经演进为多数据库连接器架构。如果你希望优先支持某种数据库,FAQ 建议通过提交 feature request 或对已有 issue 进行 +1 投票来影响路线图。
四、GraphQL 给应用开发带来哪些收益?
FAQ 用五个要点概括了 GraphQL 的核心价值,这里完整展开:
- 按需取数,减少网络流量:客户端应用可以精确请求 API 返回自己需要的那部分数据,从而降低网络传输量、提升性能;
- 前端样板代码显著减少:接入 GraphQL API 时可直接使用 Apollo Client、Relay 等客户端库,开箱即用地获得缓存、乐观 UI 更新、实时功能、离线支持等能力;
- 强类型 API 层:GraphQL API 基于强类型的 schema,开发者可以确信 API 允许哪些操作、服务端会返回什么形状的响应,降低联调出错概率;
- 丰富的工具生态:例如 GraphQL Playground 提供交互式 IDE,可用于向 API 发送查询与变更(即使非技术人员也能上手);GraphQL bindings 则允许像拼乐高积木一样组合已有的 GraphQL API(相关介绍见 docs/1.2/06-GraphQL-Ecosystem/02-GraphQL-Binding 与 03-GraphQL-Playground);
- 活跃的社区驱动演进:GraphQL 生态由出色的社区持续推动,为 GraphQL 的未来演进和新工具开发投入了大量思考与努力。
这些收益与 Prisma 的定位一脉相承:Prisma 把数据库暴露为生产可用的 GraphQL CRUD API,开发者得以直接享受上述全部优势。
五、备份如何工作?
FAQ 给出的备份思路分两个层面,本仓库均提供了具体实现佐证。
5.1 数据库原生备份:始终握有完全控制权
由于 Prisma 只是数据库之上的一层,你仍然完全拥有数据库本身,因此可以自由选择自己的备份策略(如使用 MySQL 的 mysqldump、云厂商快照等)。这一点在 CLI 源码中也有印证:export 命令实现 对 MongoDB(document store)直接提示"请使用数据库原生导出功能(如 mongodump)",并对 MySQL/Postgres 场景提示优先使用mysqldump/pg_restore等原生工具。
5.2 数据导出:从 API 层创建持续备份
Prisma 还提供数据导出功能,可在 API 层为数据创建持续备份。详见 Data Export 文档:
CLI 方式:prisma export命令,接受--export-path(短写-e)指定导出 zip 文件路径。它自动复用 CLI 认证、直接把数据写入文件系统,并在数据量较大时自动管理游标(cursor),无需手工处理多次请求。导出数据遵循 NDF 格式,按nodes、lists、relations三个目录存放,可直接导入 schema 完全相同的服务(例如为dev环境准备测试数据)。
当前仓库中该命令的实现位于 cli/packages/prisma-cli-core/src/commands/export/index.ts,其行为与 1.2 文档略有演进:不指定路径时默认生成export-<ISO时间戳>.zip,且选项已调整为--path/-p(生成后还会提示可用prisma import --data <exportPath>导入到新服务)。
原始 Export API 方式:导出端点位于服务 HTTP 端点的/export路径,例如http://localhost:60000/my-app/dev/export。单次响应最多返回 10 MB 数据,请求体如下:
{ "fileType": "nodes", "cursor": { "table": 0, "row": 0, "field": 0, "array": 0 } }cursor中的值描述数据库中的偏移量。每次导出响应都会返回新游标,有两种状态:
- 终止(导出完成):
table、row、field、array全部为-1; - 未终止(还有更多数据):任一值不等于
-1,说明本次 10 MB 上限已满,把返回的cursor原样作为下一次请求的输入即可继续导出。
对应curl请求模板:
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__}} }' \ -sSv5.3 深入理解 NDF:导入导出的中间格式
无论是导入还是导出,数据都遵循Normalized Data Format(NDF),详见 Normalized Data Format 文档。NDF 把数据按三种 value type 拆分:
| 类型 | 内容 | values 元素结构 |
|---|---|---|
nodes | 节点的标量字段 | { "_typeName": STRING, "id": STRING, "<scalarField>": ANY, ... } |
lists | 节点的标量列表字段 | { "_typeName": STRING, "id": STRING, "<scalarListField>": [ANY] } |
relations | 通过关系字段连接两个节点 | 由恰好两个元素组成的数组对[ { "_typeName": STRING, "id": STRING, "fieldName": STRING }, ... ] |
每个 NDF JSON 文档都是包含valueType与values两个键的对象。以如下数据模型为例:
type User { id: String! @unique firstName: String! lastName: String! hobbies: [String!]! partner: User }- nodes 示例:导入两个
User的标量字段:
{ "valueType": "nodes", "values": [ {"_typeName": "User", "id": "johndoe", "firstName": "John", "lastName": "Doe"}, {"_typeName": "User", "id": "sarahdoe", "firstName": "Sarah", "lastName": "Doe"} ] }- lists 示例:为两个
User导入hobbies列表字段(注意:每个对象一次只能为一个列表字段提供值):
{ "valueType": "lists", "values": [ {"_typeName": "User", "id": "johndoe", "hobbies": ["Fishing", "Cooking"]}, {"_typeName": "User", "id": "sarahdoe", "hobbies": ["Biking", "Coding"]} ] }- relations 示例:通过
partner关系字段连接两个User节点(每个元素是恰好包含两个对象的数组对):
{ "valueType": "relations", "values": [ [ { "_typeName": "User", "id": "johndoe", "fieldName": "partner" }, { "_typeName": "User", "id": "sarahdoe", "fieldName": "partner" } ] ] }_typeName对应数据模型中的 SDL 类型名,id是节点标识,fieldName/<scalarField>对应 SDL 类型中的字段名。掌握这三种 value type 的结构,是手工编写导入数据、或解读导出结果的基础。
六、小结
这篇 FAQ 围绕五个技术主题给出了明确的结论:Prisma 支持自托管(云服务商或 Prisma Cloud);接入数据库需要"SQL schema → SDL 数据模型 → 部署 service → 导入数据"三步走;MySQL 是首批支持的数据库(当前仓库已演进出多连接器架构);GraphQL 在按需取数、前端减负、强类型 API、工具生态与社区演进五个层面带来收益;备份既可以走数据库原生方案,也可以借助prisma export与原始 export API 在 API 层建立持续备份。对于有数据迁移、测试数据准备与备份需求的团队,建议进一步阅读 Data Import、Data Export 与 NDF 规范 三篇参考文档,并结合 CLI export 源码 验证实际行为。
- 后端
- 数据库
- GraphQL
【免费下载链接】prisma1
💾 Database Tools incl. ORM, Migrations and Admin UI (Postgres, MySQL & MongoDB) [deprecated]
相关推荐
Prisma 技术 FAQ 全解析:自托管部署、数据库接入、GraphQL 优势与备份策略
Prisma 技术 FAQ 全解析:自托管部署、数据库接入、GraphQL 优势与备份策略 本篇技术指南以 Prisma(仓库 prisma1 )官方 FAQ
后端数据库GraphQLPrisma 技术 FAQ 实战指南:自托管、数据库接入、GraphQL 优势与备份策略
Prisma 技术 FAQ 实战指南:自托管、数据库接入、GraphQL 优势与备份策略 本指南以 Prisma 官方技术 FAQ 为主体,系统解答开发者最常见
后端数据库GraphQLPrisma 技术 FAQ 深度解析:自托管、数据库接入、GraphQL 优势与数据备份机制
Prisma 技术 FAQ 深度解析:自托管、数据库接入、GraphQL 优势与数据备份机制 本文以 docs/1.14/05 FAQ/02 Technical
后端数据库GraphQL
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考