在Nest+GrqphQL+Prisma+React全栈开发这个系列中,我将会带领着大家从零到一,一步一步简单学会使用这些技术栈,并实际开发一个实战应用。
这篇是第二篇文章,Prisma篇。
一、 简介
Prisma是下一代 Node.js、TypeScript、Go 的数据库 ORM(意即Object relational mappers
,将数据模型和Object进行映射)这样我们就避免了直接操作数据库,我们在操作对象的时候,会自动转换为数据操作。
Prisma包含三个部分
- Prisma Client: 自动生成、类型安全的查询构建器,用于 Node.js 和 TypeScript
- Prisma Migrate: 数据迁移系统
- Prisma Studio: 查询和编辑数据库中数据的图形化界面
在Nodejs社区中,有很多的ORM库,例如TypeORM
,Sequelize
,Mongoose
,Prisma和它们有什么区别?又有哪些优势?
下面就是我总结的官方给出的答案:
Prisma主要的作用就是在生产力和可控性之间做平衡的同时,还提高了工作效率,这就是它的优势。手写SQL可控性最高,但是生产力太低,ORM生产力提高了,但是可控性又太低了。
而且使用ORM还有一些隐患,因为虽然ORM将表和对象做了映射,但是它们在思维模式上终究是有差异的,对象更注重单一状态,表更注重联系。而且对象的深度嵌套,可能会造成SQL查询的性能缓慢。
二、 组件
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()
})
复制代码