Nest+GrqphQL+Prisma+React全栈开发(一)-Prisma篇

在Nest+GrqphQL+Prisma+React全栈开发这个系列中,我将会带领着大家从零到一,一步一步简单学会使用这些技术栈,并实际开发一个实战应用。

这篇是第二篇文章,Prisma篇。

上一篇:GraphQL

一、 简介

Prisma是下一代 Node.js、TypeScript、Go 的数据库 ORM(意即Object relational mappers,将数据模型和Object进行映射)这样我们就避免了直接操作数据库,我们在操作对象的时候,会自动转换为数据操作。

Prisma包含三个部分

  • Prisma Client: 自动生成、类型安全的查询构建器,用于 Node.js 和 TypeScript
  • Prisma Migrate: 数据迁移系统
  • Prisma Studio: 查询和编辑数据库中数据的图形化界面

在Nodejs社区中,有很多的ORM库,例如TypeORMSequelizeMongoose,Prisma和它们有什么区别?又有哪些优势?

下面就是我总结的官方给出的答案:

Prisma主要的作用就是在生产力和可控性之间做平衡的同时,还提高了工作效率,这就是它的优势。手写SQL可控性最高,但是生产力太低,ORM生产力提高了,但是可控性又太低了。

而且使用ORM还有一些隐患,因为虽然ORM将表和对象做了映射,但是它们在思维模式上终究是有差异的,对象更注重单一状态,表更注重联系。而且对象的深度嵌套,可能会造成SQL查询的性能缓慢。

image.png

二、 组件

Prisma schema

Prisma schema 文件是你的 Primsa 组织结构中主要的配置文件,主要定义了数据源,生成器,以及数据模型。

datasource db {
 url = env("DATABASE_URL")
 provider = "postgresql"
}

generator client {
 provider = "prisma-client-js"
}

model User {
 id Int @id @default(autoincrement())
 createdAt DateTime @default(now())
 email String @unique
 name String?
 role Role @default(USER)
 posts Post[]
}
复制代码

Prisma 的数据模型定义了你的数据模型,它有以下这些作用:

  • 构成了应用领域的 实体
  • 映射到数据库的 (关系型数据库,例如 PostgreSQL)或 集合 (MongoDB)
  • 构成 Prisma Client API中 查询 的基础
  • 在使用 TypeScript 时,Prisma Client 为模型及其 变体提供 类型定义,保证数据库访问的类型安全

Prisma Client

Prisma Client 是一个自动生成的类型安全查询构造器,可根据你的数据进行定制。

它有这些常见的CRUD方法:

  • findMany
  • findUnique
  • create
  • update
  • upsert
  • delete
  • updateMany
  • deleteMany

除了这些,还有更多的高级用法,可以去查看官方文档。

Prisma Migrate

Prisma Migrate 是一个命令式数据库架构迁移工具,它使您能够:

  • 保持数据库架构与Prisma 架构的同步
  • 维护数据库中的现有数据

迁移完成后,会生成.sql迁移文件历史记录:

migrations/
└─ 20210313140442_init/
└─ migration.sql
└─ 20210313140442_added_job_title/
└─ migration.sql
复制代码

这样你就能很方便的进行数据的迭代或者回滚和版本管理了。

三、 上手

连接数据库,修改prisma/schema.prisma

datasource db {
 provider= "postgresql"
 url= env("DATABASE_URL")
}
复制代码

数据库地址,你可以在.env文件中进行配置:

DATABASE_URL="postgresql://johndoe:randompassword@localhost:5432/mydb?schema=public"
复制代码

接着定义你的数据库,编写prisma/schema.prisma

model Post {
 id Int @id @default(autoincrement())
 createdAt DateTime @default(now())
 updatedAt DateTime @updatedAt
 title String @db.VarChar(255)
 content String?
 published Boolean @default(false)
 author User @relation(fields: [authorId], references: [id])
 authorId Int
}
复制代码

使用prisma migrate创建数据库:

npx prisma migrate dev --name init
复制代码

使用Prisma Client进行查询数据:

import { PrismaClient } from '@prisma/client'
const prisma = new PrismaClient()
async function main() {
 // ... you will write your Prisma Client queries here
}

main()
 .catch((e) => {
 throw e
 })
 .finally(async () => {
 await prisma.$disconnect()
 })
复制代码

おすすめ

転載: juejin.im/post/7068179510646013965