TypeScript + Helix 实战:用 Prisma 与 SQLite 为 GraphQL 服务器引入持久化数据库
【免费下载链接】howtographqlThe Fullstack Tutorial for GraphQL项目地址https://gitcode.com/gh_mirrors/ho/howtographql点击查看免费下载本文围绕 HowToGraphQL 的 TypeScript Helix 后端教程中「Adding a Database」一节展开它教你在已经跑通内存版 Hacker News 克隆项目的基础上引入 Prisma 作为数据库访问层用 SQLite 文件持久化 GraphQL mutation 写入的数据。读完本篇你将掌握schema.prisma三段式数据建模、prisma migrate dev迁移流程、Prisma Client 的类型安全查询 API以及一条完整的「改模型 → 跑迁移 → 用 Client 读写」的工作流。背景为什么引入 Prisma教程的前几章已经用 Helix 搭建了一个 GraphQL 服务器feed查询和postmutation 都能工作但数据只保存在内存数组links里——重启服务器后数据就全部丢失这一点在 简单 Mutation 一章 的结尾被明确提出。要解决持久化问题本教程选择SQLite作为存储引擎、Prisma作为数据库访问层而不是手写 SQL。Prisma 是一个开源数据库工具包它为 Node.js/TypeScript 提供了干净、类型安全的查询提交 API让开发者可以清晰地推理自己的数据结构和访问方式。它主要由三部分组成Prisma Client为 Node.js 与 TypeScript 自动生成的类型安全查询构建器Prisma Migrate实验性声明式数据建模与迁移系统Prisma Studio实验性查看和编辑数据库中数据的 GUI。为什么要用它从教程的论述看GraphQL 服务器本身的静态类型 schema 和查询引擎已经解决了 API 开发中的很多痛点但真实应用里 resolver 的实现往往非常复杂GraphQL 查询可以嵌套多层深层嵌套的 resolver 实现容易带来性能问题同时还要处理认证、授权、分页、过滤、实时推送、对接第三方或遗留系统等大量附加工作流。Prisma 正是聚焦于在「与数据库打交道」这件事上提升开发者生产力它用一套与数据库结构高度吻合的数据模型同时提供类型安全和自动补全的抽象层。本节对应的文档 6-adding-a-database.md 还附带了一个随章交互小测「What is Prisma Studio?」正确答案是「A GUI to view and edit data in your database」。这类测验由站点源码中的 Quiz 组件 渲染每章 front matter 里的question/answers/correctAnswer字段即为题目数据。安装 Prisma CLI 与 Prisma Client在终端中执行以下命令把 Prisma CLI 和 Prisma Client 安装为开发依赖npm install --save-dev prisma prisma/client注意这里prisma/client是被当作 devDependency 安装的——因为生成的 Client 会在构建/运行期提供完整的类型与实现教程的项目配置沿用了这个安装方式参考 项目初始化一章 中package.json的依赖组织习惯。然后在项目根目录用 Prisma CLI 初始化 Prismanpx prisma init该命令会创建prisma/目录并在其中生成一个schema.prisma文件。解读 schema.prisma数据源、生成器、数据模型schema.prisma可以类比为「数据库 schema」但注意它与你此前在src/schema.graphql里写的 GraphQL schema 是两套东西前者描述数据库侧的模型与连接后者描述 API 侧的类型。schema.prisma有三个组成部分Data source数据源指定数据库连接Generator生成器指示生成 Prisma ClientData model数据模型定义应用模型每个模型映射到底层数据库的一张表。打开schema.prisma填入如下内容对应教程代码块中的 1/2/3 三段注释// 1 datasource db { provider sqlite url file:./dev.db } // 2 generator client { provider prisma-client-js } // 3 model Link { id Int id default(autoincrement()) createdAt DateTime default(now()) description String url String }逐段拆解Data sourceprovider sqlite告诉 Prisma 使用 SQLite 作为数据库连接url file:./dev.db以file:前缀指向一个相对路径的磁盘文件相对于prisma/目录这就是整库所在。Generatorprovider prisma-client-js声明要生成 Node.js/TypeScript 用的 Prisma Client。Data model把 GraphQL 侧的Link类型落地为数据库模型id Int id default(autoincrement())整型主键自增——替代了内存版代码里手工维护idCount生成link-0、link-1的笨办法createdAt DateTime default(now())创建时间插入时自动填充当前时间description String、url String与Link类型的两个字段一一对应。Link模型定义了稍后 Prisma 要为你创建的Link表的结构。Prisma 这套数据模型的价值在于它既贴合底层数据库模型即表、字段即列又通过生成的类型让你保留类型安全与自动补全。SQLite为什么选它如果你不熟悉 SQLite它是一个实现了「自包含、无服务器、零配置、事务性 SQL 数据库引擎」的进程内库。与大多数 SQL 数据库不同SQLite 没有独立的服务器进程它直接读写普通磁盘文件——包含多张表、索引、触发器和视图的完整 SQL 数据库就装在单个磁盘文件里。对教程这类项目而言这正是最合适的选择零运维、开箱即用数据库文件就是prisma/dev.db一个文件。创建第一个迁移prisma migrate dev现在让 Prisma 真正创建 SQLite 数据库。在项目根目录运行npx prisma migrate dev命令会提示你为这次迁移命名输入init后按Enter确认。执行完成后检查文件系统中的prisma/目录会看到一个 Prisma Migrate 新建的migrations/子目录。理解这里的机制很重要你通过数据模型告诉 Prisma「我要建一张存links的Link表数据长这样」Prisma 据此生成必要的迁移 SQL并打包进一个专属目录目录内还有描述该迁移细节的 README 文件。prisma/migrations/目录因此成为数据库演进历史的完整参照——每次新增迁移都留下一次可追溯的变更记录。至此你已经拥有一个带Link表的数据库了。生成的 Prisma Client背后发生的事情是Prisma 会生成文件到node_modules/prisma/client。每次使用PrismaClient时你拿到的都是与你的模型完全匹配的定制类型——模型里加一个字段Client 的类型声明就跟着变。如果 Client 不是最新的也可以手动触发生成npx prisma generate用 Prisma Client 写第一条查询教程建议在一个独立文件里写第一条查询避免弄乱现有的 GraphQL 服务器代码。新建src/script.ts// 1 import { PrismaClient } from prisma/client; // 2 const prisma new PrismaClient() // 3 async function main() { const allLinks await prisma.link.findMany() console.log(allLinks) } // 4 main() .catch(e { throw e }) // 5 .finally(async () { await prisma.$disconnect() })带编号注释的逐行解读从prisma/client模块导入PrismaClient构造器实例化PrismaClient定义async函数main来向数据库发送查询所有查询都写在这个函数里调用main函数脚本终止时通过$disconnect()关闭数据库连接避免连接泄漏。一个值得体会的细节是自动补全输入prisma.可以看到所有可访问的模型本例中只有link注意模型名Link在 Client 上以小驼峰暴露输入prisma.link.可以看到针对该模型可用的全部操作。这个补全能力直接来自prisma generate阶段产出的类型声明。用以下命令运行脚本npx ts-node src/script.ts此时会成功查询数据库——由于数据库还是空的输出是一个空数组。ts-node是在 项目初始化一章 中安装的工具链之一npx ts-node src/script.ts与package.json里start脚本ts-node src/index.ts用的是同一套机制可免编译直接运行 TypeScript 文件。在同一个脚本中创建一条 Link教程鼓励你亲手把下面这段代码敲进src/script.ts置于allLinks查询之前并留意补全提示——先滚动选项确认.create()正是需要的操作然后编辑器会直接展示 mutation 该怎么构造const newLink await prisma.link.create({ data: { description: Fullstack tutorial for GraphQL, url: www.howtographql.com, }, });再次执行npx ts-node src/script.ts这次终端输出里就能看到新创建的 link——它带有自动生成的id自增整型和createdAt时间戳正是schema.prisma中default(autoincrement())与default(now())在起作用。更新数据模型的标准工作流回顾整个流程Prisma 项目更新数据的典型工作流就是三步手工调整 Prisma 数据模型prisma/schema.prisma用prisma migrateCLI 命令执行数据库迁移并重新生成 Prisma Client 类型在应用代码中通过 Prisma Client 访问数据库。与后续章节的衔接从脚本走向 resolver本篇的script.ts只是验证 Prisma Client 可用。真正的落点在下一章在 Connecting The Server and Database 一章 中教程会做三件事——新建src/context.ts创建全局PrismaClient实例并通过 Helix 的processRequest选项contextFactory注入 GraphQL 执行上下文同时定义GraphQLContext类型保证类型安全删除src/schema.ts中内存版links数组与idCount让feedresolver 改为context.prisma.link.findMany()、postmutation 改为context.prisma.link.create(...)用Link类型直接从prisma/client导入替代手写的type Link定义。也就是说本篇建立的prisma/schema.prisma→ 迁移 → Client 三层结构会在下一章直接驱动 resolver 的真实读写。该章还介绍了npx prisma studio默认运行在http://localhost:5555可以用图形界面查看Link模型的数据——这正好对应本章开头小测里 Prisma Studio 的定义。小结本篇完成了 HowToGraphQL TypeScript Helix 教程的数据库引入环节用prismaprisma/client两个包初始化项目npx prisma init生成prisma/schema.prismaschema.prisma由数据源SQLitefile:./dev.db、生成器prisma-client-js、数据模型Link表自增id、createdAt、description、url三段构成npx prisma migrate dev命名init创建 SQLite 数据库并留下prisma/migrations/迁移历史独立脚本src/script.ts演示了PrismaClient的findMany/create用法配合ts-node免编译运行形成「改模型 → 迁移 → 用 Client」的标准工作流为下一章把prisma挂进 GraphQLcontext、用真实数据库替换内存假数据做好准备。适用前提Node.js 环境教程要求 12/14/16 任一较新版本且已按 项目初始化 与 GraphQL 服务器 两章搭好 Helix 服务器骨架本仓库本身是教程文档站点代码片段均对应教程引导你本地搭建的hackernews-node-ts项目。赞分享【免费下载链接】howtographqlThe Fullstack Tutorial for GraphQL项目地址https://gitcode.com/gh_mirrors/ho/howtographql点击查看免费下载相关推荐TypeScript Apollo 实战用 Prisma 为 HackerNews GraphQL 服务器接入 SQLite 数据库TypeScript Apollo 实战用 Prisma 为 HackerNews GraphQL 服务器接入 SQLite 数据库 本文是 howtogHowToGraphQL用 Prisma Client 将 TypeScript/Apollo GraphQL 服务器接入 SQLite 数据库HowToGraphQL用 Prisma Client 将 TypeScript/Apollo GraphQL 服务器接入 SQLite 数据库 本文基于 H使用 Prisma 与 TypeScript 引导构建 GraphQL 服务器graphql-yoga prisma-binding 完整实战使用 Prisma 与 TypeScript 引导构建 GraphQL 服务器graphql yoga prisma binding 完整实战 导读 本教后端数据库GraphQL上一篇深入Spoon核心揭秘AST模型构建与遍历机制 下一篇Linux存储管理终极指南LVM逻辑卷配置与NFS共享服务搭建创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考