GraphQL-Nexus 教程:使用 Prisma 实现数据持久化
前言
在构建 GraphQL API 时,数据持久化是核心需求之一。本文将介绍如何在 GraphQL-Nexus 项目中集成 Prisma 来实现数据库操作。我们将从内存数据过渡到真实数据库,让你的博客应用更加完整。
为什么选择 Prisma?
Prisma 是一个现代化的数据库工具包,它提供了几个关键组件:
- Prisma Client:自动生成、类型安全的查询构建器
- Prisma Migrate:声明式数据建模和迁移系统
- Prisma Studio:可视化数据库管理界面
Prisma 的核心是 schema.prisma
文件,它使用专用语言(DSL)来描述数据库结构、连接配置等信息。目前支持 MySQL、PostgreSQL、SQL Server 和 SQLite 四种关系型数据库。
环境准备
安装依赖
首先需要安装 Prisma 相关依赖:
npm install @prisma/client
npm install --save-dev prisma
初始化 Prisma
运行以下命令初始化 Prisma 配置:
npx prisma init
这会创建:
prisma/schema.prisma
:Prisma 架构文件.env
:环境变量文件
配置数据库连接
在 schema.prisma
中配置数据库连接。本教程使用 SQLite 作为示例:
datasource db {
provider = "sqlite"
url = "file:./dev.db"
}
generator client {
provider = "prisma-client-js"
}
数据模型设计
基于之前章节的内存数据结构,我们设计 Post 模型:
model Post {
id Int @id @default(autoincrement())
title String
body String
published Boolean
}
执行迁移
创建并应用数据库迁移:
npx prisma migrate dev --name init --preview-feature
这会:
- 创建数据库迁移文件
- 生成
dev.db
数据库文件 - 应用迁移到数据库
- 生成 Prisma Client
集成到 GraphQL-Nexus
替换内存数据库
将原来的内存数据库替换为 Prisma Client:
// api/db.ts
import { PrismaClient } from '@prisma/client'
export const db = new PrismaClient()
更新上下文类型
更新上下文类型以使用 PrismaClient:
// api/context.ts
import { db } from "./db";
import { PrismaClient } from "@prisma/client"
export interface Context {
db: PrismaClient
}
export const context = {
db,
}
重构解析器
将所有内存操作替换为 Prisma 查询:
- 查询草稿和已发布文章:
t.list.field('drafts', {
type: 'Post',
resolve(_root, _args, ctx) {
return ctx.db.post.findMany({ where: { published: false } })
},
})
t.list.field('posts', {
type: 'Post',
resolve(_root, _args, ctx) {
return ctx.db.post.findMany({ where: { published: true } })
},
})
- 创建草稿:
t.field('createDraft', {
type: 'Post',
args: {
title: nonNull(stringArg()),
body: nonNull(stringArg()),
},
resolve(_root, args, ctx) {
const draft = {
title: args.title,
body: args.body,
published: false,
}
return ctx.db.post.create({ data: draft })
},
})
- 发布文章:
t.field('publish', {
type: 'Post',
args: {
draftId: nonNull(intArg()),
},
resolve(_root, args, ctx) {
return ctx.db.post.update({
where: { id: args.draftId },
data: { published: true },
})
},
})
测试与验证
完成上述更改后,你可以:
- 启动 GraphQL Playground
- 测试创建草稿、查询草稿/文章、发布文章等操作
- 验证数据是否持久化到数据库
总结
通过本章,我们完成了:
- 从内存数据到真实数据库的迁移
- Prisma 的基本配置和使用
- GraphQL 解析器与 Prisma 的集成
这种架构的优势在于:
- 类型安全的数据访问
- 清晰的数据库模型定义
- 自动化的迁移管理
- 简洁的查询语法
在下一章中,我们将介绍如何在 Prisma 环境下进行测试,确保数据层和业务逻辑的正确性。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考