GraphQL-Nexus 教程:使用 Prisma 实现数据持久化

GraphQL-Nexus 教程:使用 Prisma 实现数据持久化

nexus Code-First, Type-Safe, GraphQL Schema Construction nexus 项目地址: https://gitcode.com/gh_mirrors/ne/nexus

前言

在构建 GraphQL API 时,数据持久化是核心需求之一。本文将介绍如何在 GraphQL-Nexus 项目中集成 Prisma 来实现数据库操作。我们将从内存数据过渡到真实数据库,让你的博客应用更加完整。

为什么选择 Prisma?

Prisma 是一个现代化的数据库工具包,它提供了几个关键组件:

  1. Prisma Client:自动生成、类型安全的查询构建器
  2. Prisma Migrate:声明式数据建模和迁移系统
  3. 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

这会:

  1. 创建数据库迁移文件
  2. 生成 dev.db 数据库文件
  3. 应用迁移到数据库
  4. 生成 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 查询:

  1. 查询草稿和已发布文章:
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 } })
  },
})
  1. 创建草稿:
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 })
  },
})
  1. 发布文章:
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 },
    })
  },
})

测试与验证

完成上述更改后,你可以:

  1. 启动 GraphQL Playground
  2. 测试创建草稿、查询草稿/文章、发布文章等操作
  3. 验证数据是否持久化到数据库

总结

通过本章,我们完成了:

  1. 从内存数据到真实数据库的迁移
  2. Prisma 的基本配置和使用
  3. GraphQL 解析器与 Prisma 的集成

这种架构的优势在于:

  • 类型安全的数据访问
  • 清晰的数据库模型定义
  • 自动化的迁移管理
  • 简洁的查询语法

在下一章中,我们将介绍如何在 Prisma 环境下进行测试,确保数据层和业务逻辑的正确性。

nexus Code-First, Type-Safe, GraphQL Schema Construction nexus 项目地址: https://gitcode.com/gh_mirrors/ne/nexus

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

邬祺芯Juliet

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值