前言
prisma出了2个大版本,两者不大相同,这里只讲prisma2。 由于之前prisma1集成比较高,导致我把prisma理解为一个graphql服务框架,是错误的。**Prisma是一种数据库工具包,可简化数据库访问,Prisma Client仅“负责”向数据库发送查询。**因此可以将其与您选择的任何HTTP服务器库或Web框架结合使用。您可以使用Prisma工具构建GraphQL或REST API,或者作为全栈应用程序的一部分-结合Prisma的程度取决于您。
- restful prisma可以和http服务框架结合生成restful框架
- graphql 使用Prisma,您可以构建连接到数据库的GraphQL服务器。 Prisma与您使用的GraphQL工具完全无关。nexus 是一个集成了prisma框架的GraphQL应用程序框架。
Prisma Labs团队是Prisma工程团队其他成员的独立组成部分,致力于开发与Prisma数据库工具不直接相关的开源工具。Prisma Labs目前致力于将大部分时间用于Nexus,以期使其成为构建GraphQL服务器的成熟后端框架。也是本文下面要讲的部分。
prisma2.0
1 什么是prisma
prisma官网:https://www.prisma.io/
prisma是一个开源的数据库工具包。它取代了传统的ORM,并使用针对TypeScript和Node.js的自动生成的查询生成器使数据库访问变得容易。
prisma包括3个部分:
- prisma client:自动生成的类型安全的Node.js和TypeScript查询构建器
- prisma migrate:声明式数据建模和迁移系统
- prisma studio:GUI查看和编辑数据库中的数据
2 工作原理
每个使用prisma的项目都以一个prisma.schema文件开始。prisma.schema文件它以一直直观的数据建模语句定义应用程序模型,还包括了数据库连接和定义了一个生成器。数据模型表示基础数据库中的表,为Prisma Client API中的查询提供基础。
下面是一个prisma schema文件例子
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
} //这里定义了数据源,指定了数据库如何连接,可以通过环境变量,它会自动从和这个文件同名的.env文件中自动读取环境变量
generator client {
provider = "prisma-client-js"
} // 这里表示要生成一个prisma client
// 下面的数据模型 data model
model Post {
id Int @id @default(autoincrement())
title String
content String?
published Boolean @default(false)
author User? @relation(fields: [authorId], references: [id])
authorId Int?
}
model User {
id Int @id @default(autoincrement())
email String @unique
name String?
posts Post[]
}
定义数据模型后,您可以生成Prisma Client,它将公开CRUD和已定义模型的查询。可以通过命令安装npm install @prisma/client
然后通过prisma generate
生成prisma client 的代码,在.prisma/client
文件夹,这里包括了自动生成的prisma client 。如果你改了data model ,需要收到运行generate命令,然后prisma client会自动更新。
Prisma Client生成后,您可以导入代码并将查询发送到数据库。代码大致如下:
import {
PrismaClient} from '@prisma/client'
const prisma = new PrismaClient()
// A `main` function so that you can use async/await
async function main() {
// ... you will write your Prisma Client queries here
// create
const post = await prisma.post.create({
data: {
title: "Prisma makes databases easy",
author: {
connect: {
email: "maria@prisma.io"},
}
}
})
const user = await prisma.user.create({
data: {
name: "Nancy1",
email: "nancy1@prisma.io",
Post: {
create: {
title: "Join us for Prisma Day 2020"}
}
}
})
// update
const post = await prisma.post.update({
where: {
id: 2},
data: {
published: true}
}